处理数据库类分配的介绍并在一些外键上遇到麻烦。我做了一些外键,但偶尔我会感到难过,无法弄清楚为什么它不起作用。
这个例子是一个大学数据库,我有一节
describe section;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| course_id | varchar(7) | NO | PRI | | |
| sec_id | varchar(10) | NO | PRI | | |
| semester | varchar(10) | NO | PRI | | |
| year | int(11) | NO | PRI | 0 | |
| building | varchar(20) | YES | MUL | NULL | |
| room_no | varchar(5) | YES | | NULL | |
| time_slot_id | varchar(5) | YES | MUL | NULL | |
+--------------+-------------+------+-----+---------+-------+
我正在尝试创建一个数据库,并且能够为ID
和course_id
创建外键,但我尝试的任何其他内容都不起作用
create table takes(
ID int,
course_id varchar(7),
sec_id varchar(10),
semester varchar(10),
year int,
grade int,
primary key (course_id, sec_id, semester, year),
foreign key (ID) references student(ID)
on delete cascade on update cascade,
foreign key (course_id) references section(course_id)
on delete cascade on update cascade
) engine = innodb;
直到这一点它才有效。
如果我尝试添加此内容,则会向我errno: 150
foreign key (sec_id)
references section(sec_id)
on delete cascade on update cascade
感谢任何帮助。我想我可能会遗漏一些关于外键的基本信息,因为它适用于course_id
但不适用于sec_id
,这似乎完全相同?
答案 0 :(得分:0)
确保两个字段的CHARACTER SET
和COLLATION
相同,即takes(sec_id)
和section(sec_id)
答案 1 :(得分:0)
的可能性:
如果数据类型匹配,可能您尚未在要定义外键关系的父列上定义索引。请检查表sec_id
中的列section
是否已定义任何索引。
请参阅 :