问题描述
我正在https://www.db-fiddle.com/
上运行sql代码,这给了我多个错误。
我说错了
模式错误:错误:ER_PARSE_ERROR:您的sql语法有错误;在第7行的“ REFERENCES department(dept_name))”附近检查与您的MysqL服务器版本相对应的手册以使用正确的语法
但是,我已经多次查看了该行的语法,并认为这很好,所以我怀疑问题出在我试图添加外键约束的问题上,但是我不确定。
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)
);