2015-02-08 172 views
-3

无法创建表由于#1215 - 不能添加外键约束

1215 - 不能添加外键约束

有什么问题吗? 是语法错误还是逻辑错误? 当我省略外键约束线,它工作正常。

create table classroom 
    (building  varchar(15), 
    room_number  varchar(7), 
    capacity  numeric(4,0), 
    primary key (building, room_number) 
    ); 
create table department 
    (dept_name  varchar(20), 
    building  varchar(15), 
    budget    numeric(12,2) check (budget > 0), 
    primary key (dept_name) 
    ); 

create table course 
    (course_id  varchar(8), 
    title   varchar(50), 
    dept_name  varchar(20), 
    credits  numeric(2,0) check (credits > 0), 
    primary key (course_id), 
    foreign key (dept_name) references department 
     on delete set null 
    ); 

create table instructor 
    (ID   varchar(5), 
    name   varchar(20) not null, 
    dept_name  varchar(20), 
    salary   numeric(8,2) check (salary > 29000), 
    primary key (ID), 
    foreign key (dept_name) references department 
     on delete set null 
    ); 

create table section 
    (course_id  varchar(8), 
     sec_id   varchar(8), 
    semester  varchar(6) 
     check (semester in ('Fall', 'Winter', 'Spring', 'Summer')), 
    year   numeric(4,0) check (year > 1701 and year < 2100), 
    building  varchar(15), 
    room_number  varchar(7), 
    time_slot_id  varchar(4), 
    primary key (course_id, sec_id, semester, year), 
    foreign key (course_id) references course 
     on delete cascade, 
    foreign key (building, room_number) references classroom 
     on delete set null 
    ); 

create table teaches 
    (ID   varchar(5), 
    course_id  varchar(8), 
    sec_id   varchar(8), 
    semester  varchar(6), 
    year   numeric(4,0), 
    primary key (ID, course_id, sec_id, semester, year), 
    foreign key (course_id,sec_id, semester, year) references section 
     on delete cascade, 
    foreign key (ID) references instructor 
     on delete cascade 
    ); 

create table student 
    (ID   varchar(5), 
    name   varchar(20) not null, 
    dept_name  varchar(20), 
    tot_cred  numeric(3,0) check (tot_cred >= 0), 
    primary key (ID), 
    foreign key (dept_name) references department 
     on delete set null 
    ); 

create table takes 
    (ID   varchar(5), 
    course_id  varchar(8), 
    sec_id   varchar(8), 
    semester  varchar(6), 
    year   numeric(4,0), 
    grade    varchar(2), 
    primary key (ID, course_id, sec_id, semester, year), 
    foreign key (course_id,sec_id, semester, year) references section 
     on delete cascade, 
    foreign key (ID) references student 
     on delete cascade 
    ); 

create table advisor 
    (s_ID   varchar(5), 
    i_ID   varchar(5), 
    primary key (s_ID), 
    foreign key (i_ID) references instructor (ID) 
     on delete set null, 
    foreign key (s_ID) references student (ID) 
     on delete cascade 
    ); 

create table time_slot 
    (time_slot_id  varchar(4), 
    day   varchar(1), 
    start_hr  numeric(2) check (start_hr >= 0 and start_hr < 24), 
    start_min  numeric(2) check (start_min >= 0 and start_min < 60), 
    end_hr   numeric(2) check (end_hr >= 0 and end_hr < 24), 
    end_min  numeric(2) check (end_min >= 0 and end_min < 60), 
    primary key (time_slot_id, day, start_hr, start_min) 
    ); 

create table prereq 
    (course_id  varchar(8), 
    prereq_id  varchar(8), 
    primary key (course_id, prereq_id), 
    foreign key (course_id) references course 
     on delete cascade, 
    foreign key (prereq_id) references course 
    ); 
+0

大部分表都有外键约束。哪一个失败? – 2015-02-08 05:36:44

回答

3

就像我所做的那样,您必须在外键引用的表名的括号前面添加dept_name。 例如:

create table course 
    (course_id  varchar(8), 
    title   varchar(50), 
    dept_name  varchar(20), 
    credits  numeric(2,0) check (credits > 0), 
    primary key (course_id), 
    foreign key (dept_name) references department(dept_name) 
     on delete set null 
    ); 
+0

我必须添加引用表的主键?或者设计密钥索引? – Guru 2015-02-08 06:04:33

+0

它必须是你在另一张桌子上引用的列。在这种情况下,部门表中的dept_name – Chatz 2015-02-08 06:11:48

+1

yups谢谢你! – Guru 2015-02-08 06:27:50