定义外键(MySQL)时出现问题

定义外键(MySQL)时出现问题,mysql,foreign-keys,Mysql,Foreign Keys,正在编写数据库类赋值的介绍,但在几个外键上遇到了问题。我做过一些外键,但偶尔会被难倒,弄不明白为什么它不起作用 这个例子是一个大学数据库,我有一节 describe section; +--------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+-------------+----

正在编写数据库类赋值的介绍,但在几个外键上遇到了问题。我做过一些外键,但偶尔会被难倒,弄不明白为什么它不起作用

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

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    |       |
+--------------+-------------+------+-----+---------+-------+
我正在尝试创建一个takes数据库,并且能够为
ID
course\u 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

感谢您的帮助。我想我可能遗漏了外键的一些基本信息,因为它适用于
课程id
,但不适用于
秒id
,这两个字段似乎完全相同?

请确保两个字段的
字符集
排序规则
相同,即
取数(秒id)
节数(秒id)

请参阅此检查表:

可能性:

  • 数据类型(包括未签名)不匹配
  • 父字段未编制索引
  • 如果数据类型匹配,则可能您尚未在要定义外键关系的父列上定义索引。请检查表
    部分
    中的列
    sec_id
    是否定义了索引

    请参阅


    它们似乎都是一样的。对于Secu id,排序规则为latin1_swedish_ci,对于year,排序规则为NULL。“section”表的引擎是什么?请检查回答中的链接。在看到
    错误号:150
    后,运行
    显示引擎INNODB状态
    。它包含有关添加新外键失败原因的信息。