MySQL : ERROR 1215 (HY000): Cannot add foreign key constraint
我读过数据库系统概念,第6版,Silberschatz。 我将在MySQL的OS X上实现第2章中所示的大学数据库系统。 但是我在创建表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | mysql> select * from department -> ; +------------+----------+-----------+ | dept_name | building | budget | +------------+----------+-----------+ | Biology | Watson | 90000.00 | | Comp. Sci. | Taylor | 100000.00 | | Elec. Eng. | Taylor | 85000.00 | | Finance | Painter | 120000.00 | | History | Painter | 50000.00 | | Music | Packard | 80000.00 | | Physics | Watson | 70000.00 | +------------+----------+-----------+ mysql> show columns from department -> ; +-----------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+---------------+------+-----+---------+-------+ | dept_name | varchar(20) | NO | PRI | | | | building | varchar(15) | YES | | NULL | | | budget | decimal(12,2) | YES | | NULL | | +-----------+---------------+------+-----+---------+-------+ |
创建表
1 2 3 4 5 6 7 8 | mysql> create table course -> (course_id varchar(7), -> title varchar (50), -> dept_name varchar(20), -> credits numeric(2,0), -> primary key(course_id), -> foreign key (dept_name) references department); ERROR 1215 (HY000): Cannot add foreign key constraint |
在搜索谷歌的外键约束后,我刚刚得知"外键约束"这个词表示表
如果没有,为什么作者让我执行那个SQL语句?
如果我真的执行了错误的SQL语句,在插入一些数据后,是否必须在课程表中将
编辑:在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ------------------------ LATEST FOREIGN KEY ERROR ------------------------ 2013-09-21 16:02:20 132cbe000 Error in foreign key constraint of table university/course: foreign key (dept_name) references department): Syntax error close to: ) mysql> set foreign_key_checks=0 -> ; Query OK, 0 rows affected (0.00 sec) mysql> create table course -> (course_id varchar(7), -> title varchar(50), -> dept_name varchar(20), -> credits numeric(2,0), -> primary key(course_id), -> foreign key (dept_name) references department); ERROR 1215 (HY000): Cannot add foreign key constraint |
当您收到这个模糊的错误消息时,您可以通过运行找出更具体的错误
最常见的原因是,在创建外键时,引用字段和外键字段都需要匹配:
- 引擎应该是相同的,例如InnoDB的
-
数据类型应该相同,并且长度相同。
例如VARCHAR(20)或INT(10)UNSIGNED - 整理应该是相同的。例如UTF8
- 唯一 - 外键应引用引用表中唯一(通常为私有)的字段。
此错误的另一个原因是:
您已定义SET NULL条件,但某些列定义为NOT NULL。
1 2 |
所以你的MySQL DDL应该是:
1 2 3 4 5 6 7 8 9 | create table course ( course_id varchar(7), title varchar(50), dept_name varchar(20), credits numeric(2 , 0 ), primary key (course_id), FOREIGN KEY (dept_name) REFERENCES department (dept_name) ); |
此外,在
可以在MySQL文档中找到更多信息
也许你的
您可以尝试更改其中一个或两个:
1 2 |
1 |
此语法对MySQL无效。它应该是:
1 |
MySQL要求
13.1.17.2. Using FOREIGN KEY Constraints
... [the] essential syntax for a foreign key constraint definition in a
CREATE TABLE orALTER TABLE statement looks like this:
1
2
3
4
5
6
7
8 [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION
ERROR 1215 (HY000): Cannot add foreign key constraint
还值得注意的是,当另一个中的外键列的类型未明确匹配正确表中的列时,会出现此错误。
例如:
1 2 3 4 5 6 | alter table schoolPersons add index FKEF5AB5E532C8FBFA (student_id), add constraint FKEF5AB5E532C8FBFA foreign key (student_id) references student (id); ERROR 1215 (HY000): Cannot add foreign key constraint |
这是因为
1 2 3 4 5 |
而
1 2 3 4 5 | mysql> desc persons; +--------------+----------------------+------+-----+-------------------+-----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+----------------------+------+-----+-------------------+-----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | |
如果外键不是其自己的表中的主键,也可能会出现此错误。
我做了一个ALTER TABLE并意外删除了列的主键状态,并得到了这个错误。
I don't meet the problem as you. But I get the same ERROR Message. So I mark it down here for others' convience.
如果列类型为
1 |
解决它是使用相同的字符集。例如
下面的代码对我有用
1 2 | set @@foreign_key_checks=0; ALTER TABLE `table1` ADD CONSTRAINT `table1_fk1` FOREIGN KEY (`coloumn`) REFERENCES `table2` (`id`) ON DELETE CASCADE; |
只需为FOREIGN约束添加'unsigned'即可
在我的情况下charset,datatype每件事都是正确的。经过调查,我发现在父表中,外键列上没有索引。一旦添加问题就解决了。
即使这与您的情况没有直接关联,也可能有助于进一步的读者注意,如果您不遵守创建数据库表的顺序,则在键入
当遵循表创建顺序而不考虑外键约束中涉及的列时,也是如此。
我也遇到过同样的问题。不知道为什么这有效但它确实有效:
尝试在创建查询后添加ENGINE INNODB。
1 2 3 4 5 6 7 | mysql> create table course -> (course_id varchar(7), -> title varchar (50), -> dept_name varchar(20), -> credits numeric(2,0), -> primary key(course_id), -> foreign key (dept_name) references department) ENGINE INNODB; |
我没有看到任何人明确说明这一点,我有同样的错误信息,我的问题是我试图将一个外键添加到TEMPORARY表。如手册中所述,这是不允许的
Foreign key relationships involve a parent table that holds the central data values, and a child table with identical values pointing back to its parent. The FOREIGN KEY clause is specified in the child table. The parent and child tables must use the same storage engine. They must not be TEMPORARY tables.
(强调我的)
值得注意的是,如果您在REFERENCES部分中使用的目标表或列根本不存在,也会发生此错误。
1 |
这是怎么回事......看一下引用列部分。 (V_code)