微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mySQL-无法添加外键约束,但也给我一个语法错误

如何解决mySQL-无法添加外键约束,但也给我一个语法错误

我正在https://www.db-fiddle.com/上运行sql代码,这给了我多个错误

我说错了

架构错误错误:ER_CANNOT_ADD_FOREIGN:无法添加外键约束

但是不久之后,我又收到另一个错误提示

模式错误错误:ER_PARSE_ERROR:您的sql语法有错误;在第7行的“ REFERENCES department(dept_name))”附近检查与您的MysqL服务器版本相对应的手册以使用正确的语法

但是,我已经多次查看了该行的语法,并认为这很好,所以我怀疑问题出在我试图添加外键约束的问题上,但是我不确定。

这是我的完整sql代码

CREATE TABLE student(
    ID INT UNSIGNED NOT NULL AUTO_INCREMENT,name VARCHAR(255) NOT NULL,dept_name VARCHAR(100) NOT NULL,tot_cred SMALLINT NOT NULL,PRIMARY KEY (ID),FOREIGN KEY (dept_name) REFERENCES department(dept_name)
    );

CREATE TABLE department(
    dept_name VARCHAR(100) NOT NULL,building VARCHAR(100) NOT NULL,budget DECIMAL(10,2) UNSIGNED,PRIMARY KEY(dept_name)
    );

CREATE TABLE advisor(
    s_id INT UNSIGNED NOT NULL,i_id INT UNSIGNED NOT NULL,PRIMARY KEY (s_id),FOREIGN KEY (s_id) REFERENCES student(ID),FOREIGN KEY (i_id) REFERENCES instructor(ID)
    );

CREATE TABLE instructor(
    ID INT UNSIGNED NOT NULL AUTO_INCREMENT,salary DECIMAL(10,2) UNSIGNED NOT NULL,FOREIGN KEY dept_name REFERENCES department(dept_name)
    );

CREATE TABLE course(
    course_id VARCHAR(100) NOT NULL,title VARCHAR(255) NOT NULL,cedits SMALLINT UNSIGNED NOT NULL,PRIMARY KEY (course_id),FOREIGN KEY (dept_name) REFERENCES department(dept_name)
    );

CREATE TABLE prereq(
    course_id VARCHAR(100) NOT NULL,prereq_id VARCHAR(100) NOT NULL,PRIMARY KEY(course_id,prereq_id),FOREIGN KEY(course_id) REFERENCES course(course_id)
    );

CREATE TABLE takes(
    ID INT UNSIGNED,course_id INT UNSIGNED NOT NULL,sec_id VARCHAR(100) NOT NULL,semester VARCHAR(100) NOT NULL,year SMALLINT UNSIGNED NOT NULL,grade DECIMAL(5,PRIMARY KEY (ID,course_id,sec_id,semester,year)
    FOREIGN KEY (ID) REFERENCES student(ID),FOREIGN KEY (course_id) REFERENCES course(course_id),FOREIGN KEY (sec_id) REFERENCES section(sec_id),FOREIGN KEY (semester) REFERENCES section(semester),FOREIGN KEY (year) REFERENCES section(year),);

CREATE TABLE section(
    course_id INT UNSIGNED NOT NULL,room_no VARCHAR(100) NOT NULL,time_slot_id INT UNSIGNED NOT NULL,PRIMARY KEY (course_id,year),FOREIGN KEY (course_id) REFERENCES section(course_id),FOREIGN KEY (building) REFERENCES classroom(building),FOREIGN KEY (room_no) REFERENCES classroom(room_no),FOREIGN KEY (time_slot_id) REFERENCES time_slot(time_slot_id)
    );

CREATE TABLE time_slot(
    time_slot_id INT UNSIGNED NOT NULL,day DATE NOT NULL,start_hour TIME NOT NULL,start_min TIME NOT NULL,end_hour TIME NOT NULL,end_min TIME NOT NULL,PRIMARY KEY (time_slot_id,day,start_hour,start_min)
    );

CREATE TABLE classroom(
    building VARCHAR(100) NOT NULL,capacity SMALLINT NOT NULL,PRIMARY KEY (building,room_no)
    );

CREATE TABLE teaches(
    ID INT UNSIGNED,course_id INT UNSIGNED,sec_id VARCHAR(100),semester VARCHAR(100),year INT UNSIGNED,PRIMARY KEY(ID,FOREIGN KEY(ID) REFERENCES instructor(ID),FOREIGN KEY(course_id) REFERENCES section(course_id),FOREIGN KEY(sec_id) REFERENCES section(sec_id),FOREIGN KEY(semester) REFERENCES section(semester),FOREIGN KEY(year) REFERENCES section(year)
    );

编辑: 现在,我已经编辑了表的位置,以便在sql文件中没有外键引用另一列之前就已经引用了,但是我仍然遇到相同的错误,尽管它的出现频率较低

这是新代码

CREATE TABLE time_slot(
    time_slot_id INT UNSIGNED NOT NULL,start_min)
    );

CREATE TABLE department(
    dept_name VARCHAR(100) NOT NULL,PRIMARY KEY(dept_name)
    );

CREATE TABLE student(
    ID INT UNSIGNED NOT NULL AUTO_INCREMENT,FOREIGN KEY (dept_name) REFERENCES department(dept_name)
    );


CREATE TABLE instructor(
    ID INT UNSIGNED NOT NULL AUTO_INCREMENT,FOREIGN KEY (dept_name) REFERENCES department(dept_name)
    );

CREATE TABLE course(
    course_id VARCHAR(100) NOT NULL,FOREIGN KEY(course_id) REFERENCES course(course_id)
    );


CREATE TABLE classroom(
    building VARCHAR(100) NOT NULL,room_no)
    );


CREATE TABLE section(
    course_id INT UNSIGNED NOT NULL,FOREIGN KEY (time_slot_id) REFERENCES time_slot(time_slot_id)
    );

CREATE TABLE takes(
    ID INT UNSIGNED,);



CREATE TABLE teaches(
    ID INT UNSIGNED,FOREIGN KEY(year) REFERENCES section(year)
    );

CREATE TABLE advisor(
    s_id INT UNSIGNED NOT NULL,FOREIGN KEY (i_id) REFERENCES instructor(ID)
    );

解决方法

您有很多错误。

首先,所有colaumn和引用必须具有相同的数据类型,其他所有内容都会产生错误。

接下来的事情是每个被引用的表都需要为每个引用建立一个索引

例如

FOREIGN KEY(course_id) REFERENCES section(course_id),FOREIGN KEY(sec_id) REFERENCES section(sec_id),FOREIGN KEY(semester) REFERENCES section(semester),FOREIGN KEY(year) REFERENCES section(year)

每次显示都需要四个奇异索引

但是

 FOREIGN KEY (course_id,sec_id,semester,year) REFERENCES section(course_id,year)

该部分已经有主键索引

如果这是您的第一种方法,请记住一点点的注意事项,并且由于他的要求,您需要及时调整您的设计

但是你可以做

CREATE TABLE time_slot(
    time_slot_id INT UNSIGNED NOT NULL,day DATE NOT NULL,start_hour TIME NOT NULL,start_min TIME NOT NULL,end_hour TIME NOT NULL,end_min TIME NOT NULL,PRIMARY KEY (time_slot_id,day,start_hour,start_min)
    );

CREATE TABLE department(
    dept_name VARCHAR(100) NOT NULL,building VARCHAR(100) NOT NULL,budget DECIMAL(10,2) UNSIGNED,PRIMARY KEY(dept_name)
    );

CREATE TABLE student(
    ID INT UNSIGNED NOT NULL AUTO_INCREMENT,name VARCHAR(255) NOT NULL,dept_name VARCHAR(100) NOT NULL,tot_cred SMALLINT NOT NULL,PRIMARY KEY (ID),FOREIGN KEY (dept_name) REFERENCES department(dept_name)
    );


CREATE TABLE instructor(
    ID INT UNSIGNED NOT NULL AUTO_INCREMENT,salary DECIMAL(10,2) UNSIGNED NOT NULL,FOREIGN KEY (dept_name) REFERENCES department(dept_name)
    );

CREATE TABLE course(
    course_id VARCHAR(100) NOT NULL,title VARCHAR(255) NOT NULL,cedits SMALLINT UNSIGNED NOT NULL,PRIMARY KEY (course_id),FOREIGN KEY (dept_name) REFERENCES department(dept_name)
    );

CREATE TABLE prereq(
    course_id VARCHAR(100) NOT NULL,prereq_id VARCHAR(100) NOT NULL,PRIMARY KEY(course_id,prereq_id),FOREIGN KEY(course_id) REFERENCES course(course_id)
    );


CREATE TABLE classroom(
    building VARCHAR(100) NOT NULL,room_no VARCHAR(100) NOT NULL,capacity SMALLINT NOT NULL,PRIMARY KEY (building,room_no)
    );


CREATE TABLE section(
    course_id VARCHAR(100) NOT NULL,sec_id VARCHAR(100) NOT NULL,semester VARCHAR(100) NOT NULL,year SMALLINT UNSIGNED NOT NULL,time_slot_id INT UNSIGNED NOT NULL,PRIMARY KEY (course_id,year),FOREIGN KEY (course_id) REFERENCES course(course_id),FOREIGN KEY (building,room_no) REFERENCES classroom(building,room_no),FOREIGN KEY (time_slot_id) REFERENCES time_slot(time_slot_id)
    );

CREATE TABLE takes(
    ID INT UNSIGNED,course_id VARCHAR(100) NOT NULL,grade DECIMAL(5,PRIMARY KEY (ID,course_id,FOREIGN KEY (ID) REFERENCES student(ID),FOREIGN KEY (course_id,year)

    );



CREATE TABLE teaches(
    ID INT UNSIGNED,course_id VARCHAR(100),sec_id VARCHAR(100),semester VARCHAR(100),year SMALLINT UNSIGNED,PRIMARY KEY(ID,FOREIGN KEY(ID) REFERENCES instructor(ID),year)
    );

CREATE TABLE advisor(
    s_id INT UNSIGNED NOT NULL,i_id INT UNSIGNED NOT NULL,PRIMARY KEY (s_id),FOREIGN KEY (s_id) REFERENCES student(ID),FOREIGN KEY (i_id) REFERENCES instructor(ID)
    );

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。