创建关联表SQL出现#1064语法错误,请求排查第7行问题
咱们先来拆解你遇到的#1064语法错误以及逻辑问题,这些问题直接导致了语句执行失败:
核心语法错误(直接触发#1064)
- 引用列时错误使用单引号:所有
REFERENCES后面的列名你用了单引号(比如REFERENCES patient ('patient_id')),MySQL中列名不需要用单引号包裹,单引号是用来表示字符串常量的。正确写法是直接写列名,仅当列名是关键字时才需要用反引号(`)包裹。
表结构的逻辑错误
1. patient表的多余外键
你给patient表加了一个关联自身patient_id的外键,这完全没必要——主键本身已经是唯一标识,不需要自己关联自己,这个约束应该直接删掉。
2. disease表的自增外键错误
disease表的patient_id被设置为AUTO_INCREMENT,但它作为外键需要引用patient表的patient_id,自增列会自动生成独立值,这会和patient表的主键值完全脱节,不符合外键的关联逻辑,必须去掉AUTO_INCREMENT。
3. disease表的无意义自引用外键
disease表中你写了CONSTRAINT disease_info FOREIGN KEY(disease_name) REFERENCES disease ('disease_name'),这是尝试把disease_name作为外键关联自身,但disease_name不是该表的主键,而且这种自引用在这里没有业务意义,应该删掉。
4. 约束名称重复
你在disease表和provider表都用了disease_info作为约束名称,MySQL中同一个数据库里的约束名称必须唯一,得改成不同的名字,比如provider里改成provider_disease_fk。
5. provider表的逻辑关联错误
provider表的disease_id是自增列,但你关联的是disease的disease_name,逻辑完全不匹配。如果要关联disease表,建议给disease加一个独立的disease_id主键,或者确保disease的disease_name是唯一的(加UNIQUE约束)再关联。
修正后的SQL示例
-- 先创建基础表patient CREATE TABLE patient( patient_id INT(3) NOT NULL AUTO_INCREMENT, place VARCHAR(20) NOT NULL, profession VARCHAR(30) NOT NULL, age INT(11), PRIMARY KEY (patient_id) ); -- 创建disease表,关联patient的patient_id CREATE TABLE disease ( disease_id INT(3) NOT NULL AUTO_INCREMENT, -- 新增独立主键 patient_id INT(3) NOT NULL, disease_name VARCHAR(20) NOT NULL, duration_of_stay INT(11), PRIMARY KEY (disease_id), CONSTRAINT disease_patient_fk FOREIGN KEY(patient_id) REFERENCES patient(patient_id), UNIQUE KEY unique_disease_name (disease_name) -- 确保disease_name唯一,方便provider关联 ); -- 创建provider表,关联disease的disease_name CREATE TABLE provider( provider_id INT(3) NOT NULL AUTO_INCREMENT, disease_name VARCHAR(20) NOT NULL, doctor_name VARCHAR(20) NOT NULL, PRIMARY KEY (provider_id), CONSTRAINT provider_disease_fk FOREIGN KEY (disease_name) REFERENCES disease(disease_name) );
修改后不仅语法合规,逻辑上也符合三张表的关联需求:patient和disease通过patient_id关联,disease和provider通过唯一的disease_name关联。
内容的提问来源于stack exchange,提问作者Dandrew

