67

我已阅读数据库系统概念,第 6 版,Silberschatz。我将在 MySQL 上的 OS X 上实现第 2 章中所示的大学数据库系统。但是我在创建表时遇到了麻烦course。桌子department看起来像

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

创建表course会导致以下错误。

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

在谷歌搜索外键约束后,我刚刚了解到“外键约束”一词表示表中外键列的数据course必须存在于表中的主键列中department。但是我应该在插入数据时遇到这个错误。

如果不是,为什么作者让我执行那个 SQL 语句?

如果我真的执行了错误的SQL语句,我插入一些数据后是否必须dept_name在课程表中指定为外键?

编辑:输入set foreign_key_checks=0mysql>不能修复错误。

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

18 回答 18

89

当您收到此模糊的错误消息时,您可以通过运行找出更具体的错误

SHOW ENGINE INNODB STATUS;

最常见的原因是在创建外键时,被引用的字段和外键字段都需要匹配:

  • 引擎应该是相同的,例如 InnoDB
  • 数据类型应该相同,并且具有相同的长度。
    例如 VARCHAR(20) 或 INT(10) 无符号
  • 排序规则应该相同。例如 utf8
  • 唯一- 外键应引用引用表中唯一(通常是私有)的字段。

此错误的另一个原因是:
您定义了一个 SET NULL 条件,尽管某些列被定义为 NOT NULL。

于 2016-01-22T17:52:03.587 回答
57

FOREIGN KEYfor的语法CREATE TABLE结构如下:

FOREIGN KEY (index_col_name)
        REFERENCES table_name (index_col_name,...)

所以你的 MySQL DDL 应该是:

 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)
    );

此外,在department表中dept_name应该VARCHAR(20)

更多信息可以在MySQL 文档中找到

于 2013-09-21T07:39:26.543 回答
24

也许您的dept_name列有不同的字符集。

您可以尝试更改其中一个或两个:

ALTER TABLE department MODIFY dept_name VARCHAR(20) CHARACTER SET utf8;
ALTER TABLE course MODIFY dept_name VARCHAR(20) CHARACTER SET utf8;
于 2014-09-11T12:45:22.300 回答
6
foreign key (dept_name) references department

此语法对 MySQL 无效。它应该是:

foreign key (dept_name) references department(dept_name)

MySQL 需要dept_name使用两次。一次定义外部列,一次定义主列。

13.1.17.2。使用外键约束

CREATE TABLE... [the] or语句中外键约束定义的基本语法ALTER TABLE如下所示:

[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
于 2013-09-21T08:20:13.060 回答
5

如果外键不是其自己表中的主键,也可能出现此错误。

我做了一个 ALTER TABLE 并且不小心删除了列的主键状态,并得到了这个错误。

于 2016-10-25T22:36:11.163 回答
5

ERROR 1215 (HY000): 无法添加外键约束

还值得注意的是,当另一个able 中作为外键的列的类型与正确表中的列不明确匹配时,您会收到此错误。

例如:

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

这是因为该student_id字段被定义为:

mysql> desc schoolPersons;
+--------------------+------------+------+-----+---------+----------------+
| Field              | Type       | Null | Key | Default | Extra          |
+--------------------+------------+------+-----+---------+----------------+
| student_id         | bigint(20) | YES  |     | NULL    |                |

而表中的id字段student定义为:

mysql> desc persons;
+--------------+----------------------+------+-----+-------------------+-----------------+
| Field        | Type                 | Null | Key | Default           | Extra           |
+--------------+----------------------+------+-----+-------------------+-----------------+
| id           | int(10) unsigned     | NO   | PRI | NULL              | auto_increment  |

(bigint(20)由 java 生成的 hibernate) 与(Java )long不兼容。int(10) unsignedint

于 2017-05-18T22:07:04.773 回答
2

只需为 FOREIGN 约束添加“无符号”

`FK` int(11) unsigned DEFAULT NULL,
于 2017-03-02T10:09:08.047 回答
2

我不像你那样遇到问题。但我收到相同的错误消息。所以我在这里标记它以方便其他人。

如果列类型为char或,请检查两个表的字符集varchar。我使用 a charset=gbk,但我创建了一个默认为charset=utf8. 所以字符集是不一样的。

ERROR 1215 (HY000): Cannot add foreign key constraint

解决它是使用相同的字符集。例如utf8.

于 2017-11-20T12:20:46.420 回答
1

值得注意的是,如果您在 REFERENCES 部分中使用的目标表或列根本不存在,也会发生此错误。

于 2016-01-12T23:58:25.220 回答
1

下面的代码对我有用

set @@foreign_key_checks=0;
ALTER TABLE  `table1` ADD CONSTRAINT `table1_fk1` FOREIGN KEY (`coloumn`) REFERENCES `table2` (`id`) ON DELETE CASCADE;
于 2017-11-01T10:55:17.597 回答
1

在我的情况下,父表和子表之间的引擎是不同的。使引擎相等是有效的

问题:父表'engine'=>'MyISAM',子表'engine'=>'innoDB',

更正:父表 'engine' => 'MyISAM',子表 'engine' => 'MyISAM',

于 2021-11-07T18:51:29.333 回答
0

我没有看到任何人明确说明这一点,并且我有同样的错误消息,我的问题是我试图将外键添加到 TEMPORARY 表中。如手册中所述,这是不允许的

外键关系涉及一个包含中心数据值的父表,以及一个具有相同值的子表,它们指向其父表。FOREIGN KEY 子句在子表中指定。父表和子表必须使用相同的存储引擎。它们不能是 TEMPORARY 表。

(强调我的)

于 2018-04-06T16:00:23.733 回答
0

我也遇到了同样的问题。不知道为什么这有效,但它确实有效:尝试在创建查询后添加 ENGINE INNODB。

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;
于 2018-05-18T04:49:07.813 回答
0

show engine innodb mstatus即使这与您的情况没有直接联系,它也可能有助于进一步的读者注意,如果您不遵守创建数据库表的顺序,您在键入时会得到完全相同的错误输出;这意味着您不能添加引用尚不存在的表的外部约束。引用表必须在指向它的表之前存在。

当遵守表创建顺序但不遵守外键约束中涉及的列时也是如此。

于 2019-03-01T08:20:58.913 回答
0

就我而言,字符集、数据类型每件事都是正确的。经过调查,我发现在父表中,外键列上没有索引。一旦添加的问题得到解决。

在此处输入图像描述

于 2019-04-17T03:34:54.290 回答
0

当我尝试从 PhpAdminMySQL 导出中导入(在 MysqlWorkbench 中)时出现此错误。验证后我禁用了唯一键和外键:

SET unique_checks=0;
SET foreign_key_checks = 0;

我仍然得到同样的错误(MySQL : ERROR 1215 (HY000): Cannot add foreign key constraint)。此创建语句发生错误。

DROP TABLE IF EXISTS `f1_pool`;
CREATE TABLE `f1_pool` (
 `id` int(11) NOT NULL,
 `name` varchar(45) NOT NULL,
 `description` varchar(45) DEFAULT NULL COMMENT 'Optional',
 `ownerId` int(11) NOT NULL,
 `lastmodified` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

没有外键或唯一索引,那么这里出了什么问题?最后(令人费解的 90 分钟后)我决定重新启动 MySQL 并通过一项修改再次进行导入:我在导入之前删除了所有表。并且没有错误,所有功能正常,表和视图恢复。所以我的建议是,如果一切正常,首先尝试重新启动 MySQL!

于 2020-08-23T17:59:07.740 回答
0

请注意,它可能是几种不同的东西。

在我的情况下,它是表/字段排序规则:

  • FK目标:CHARSET=utf8 COLLATE=utf8_unicode_ci
  • FK 源字段:CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
于 2021-12-01T18:37:10.373 回答
-1
CONSTRAINT vendor_tbfk_1 FOREIGN KEY (V_CODE) REFERENCES vendor (V_CODE) ON UPDATE CASCADE

这就是它可能的样子......看看引用列部分。(V_code)

于 2016-09-06T07:53:38.847 回答