定义外键时遇到问题(MySQL)

时间:2014-03-05 03:43:12

标签: mysql foreign-keys

处理数据库类分配的介绍并在一些外键上遇到麻烦。我做了一些外键,但偶尔我会感到难过,无法弄清楚为什么它不起作用。

这个例子是一个大学数据库,我有一节

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    |       |
+--------------+-------------+------+-----+---------+-------+

我正在尝试创建一个数据库,并且能够为IDcourse_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,这似乎完全相同?

2 个答案:

答案 0 :(得分:0)

确保两个字段的CHARACTER SETCOLLATION相同,即takes(sec_id)section(sec_id)

请参阅此检查表:http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/

答案 1 :(得分:0)

的可能性:

  1. 数据类型(包括无符号)不匹配。
  2. 未对父字段编制索引。
  3. 如果数据类型匹配,可能您尚未在要定义外键关系的父列上定义索引。请检查表sec_id中的列section是否已定义任何索引。

    请参阅