默认情况下,MySQL外键检查=1,但不工作
在MySQL版本14.14发行版5.7.25上,对于Linux(x86_64),默认设置默认情况下,MySQL外键检查=1,但不工作,mysql,Mysql,在MySQL版本14.14发行版5.7.25上,对于Linux(x86_64),默认设置@@GLOBAL.foreign_key_checks=1似乎不起作用,因为我试图插入一行,该行包含父表键中不存在的值,并且插入成功 尽管默认设置了外键检查=1,为什么我必须设置外键检查=1 例如,我有一个如下所示的表: mysql> SHOW CREATE TABLE score\G *************************** 1. row ************************
@@GLOBAL.foreign_key_checks=1
似乎不起作用,因为我试图插入一行,该行包含父表键中不存在的值,并且插入成功
尽管默认设置了外键检查=1
,为什么我必须设置外键检查=1
例如,我有一个如下所示的表:
mysql> SHOW CREATE TABLE score\G
*************************** 1. row ***************************
Table: score
Create Table: CREATE TABLE `score` (
`student_id` int(10) unsigned NOT NULL,
`event_id` int(10) unsigned NOT NULL,
`score` int(11) NOT NULL,
PRIMARY KEY (`event_id`,`student_id`),
KEY `student_id` (`student_id`),
CONSTRAINT `fk_event_id` FOREIGN KEY (`event_id`) REFERENCES `grace_event` (`event_id`) ON UPDATE CASCADE,
CONSTRAINT `fk_student_id` FOREIGN KEY (`student_id`) REFERENCES `student` (`student_id`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
1 row in set (0.00 sec)
…我输入了mysql>INSERT-INTO-score(event\u id,student\u id,score)值(99999999,0)代码>得到了这个
查询正常,1行受影响(0.01秒)
因此,我阅读了以下网页,试图解释为什么插入本应成功的插入
…但它们似乎都没有解释INSERT
成功的原因/方式(不幸的是)
我确保我的3张表都符合以下条件:
- 外键必须是
INT UNSIGNED
。对
- 默认存储引擎必须是
InnoDB
。对李>
- 对每个外键声明使用更新级联上的
。对
- phpmyadmin显示
外键检查
设置为ON
。对
…并选择@@GLOBAL。外键检查显示
mysql> SELECT @@GLOBAL.foreign_key_checks;
+-----------------------------+
| @@GLOBAL.foreign_key_checks |
+-----------------------------+
| 1 |
+-----------------------------+
使用上述所有设置,mysql>插入分数(事件id、学生id、分数)值(99999999,0)代码>仍然成功
直到我设置了外键检查=1后,INSERT
才最终失败
错误1452(23000):无法添加或更新子行:外键
约束失败(sampdb
score
,约束fk\U事件\u id
FOREIGN
键(event\u id
)在更新时引用grace\u event
(event\u id
)
级联)
当默认设置为1时,为什么我必须设置外键检查=1
?这是一个bug吗?我无法重现这个问题:
mysql>选择版本();
+-----------+
|版本(|
+-----------+
| 5.7.25 |
+-----------+
一行一组(0.00秒)
mysql>选择@GLOBAL.foreign\u key\u checks、@SESSION.foreign\u key\u checks;
+-----------------------------+------------------------------+
|@@GLOBAL.foreign\u key\u checks@@SESSION.foreign\u key\u checks|
+-----------------------------+------------------------------+
| 1 | 1 |
+-----------------------------+------------------------------+
一行一组(0.00秒)
mysql>删除表(如果存在)`student`、`grace_event`、`score`);
查询正常,0行受影响,3条警告(0.00秒)
mysql>创建表(如果不存在)`student`(
->`student_id`int(10)无符号非空主键
->)ENGINE=InnoDB默认字符集=utf8mb4 COLLATE=utf8mb4\u unicode\u ci;
查询正常,0行受影响(0.00秒)
mysql>创建表(如果不存在)`grace_事件`(
->`grace_event`int(10)无符号非空主键
->)ENGINE=InnoDB默认字符集=utf8mb4 COLLATE=utf8mb4\u unicode\u ci;
查询正常,0行受影响(0.00秒)
mysql>创建表(如果不存在)`score`(
->`student_id`int(10)无符号非空,
->`event_id`int(10)unsigned NOT NULL,
->`score`int(11)不为空,
->主键(`event\u id`、`student\u id`),
->键“学生id”(“学生id”),
->约束'fk_event_id'外键('event_id`)
->在更新级联上引用“grace\u事件”(“grace\u事件”),
->约束'fk\u student\u id'外键('student\u id`)
->在更新级联中引用'student'('student\u id')
->)ENGINE=InnoDB默认字符集=utf8mb4 COLLATE=utf8mb4\u unicode\u ci;
查询正常,0行受影响(0.00秒)
mysql>插入到'score'中`
->(`event\u id`、`student\u id`、`score`)
->价值观
-> (9999, 9999, 0);
错误1452(23000):无法添加或更新子行:外键
约束失败(`test`.`score`,约束
`fk_event_id`外键(`event_id`)引用
`grace\u事件(更新级联上的“grace\u事件”)
我无法重现该问题:
mysql>选择版本();
+-----------+
|版本(|
+-----------+
| 5.7.25 |
+-----------+
一行一组(0.00秒)
mysql>选择@GLOBAL.foreign\u key\u checks、@SESSION.foreign\u key\u checks;
+-----------------------------+------------------------------+
|@@GLOBAL.foreign\u key\u checks@@SESSION.foreign\u key\u checks|
+-----------------------------+------------------------------+
| 1 | 1 |
+-----------------------------+------------------------------+
一行一组(0.00秒)
mysql>删除表(如果存在)`student`、`grace_event`、`score`);
查询正常,0行受影响,3条警告(0.00秒)
mysql>创建表(如果不存在)`student`(
->`student_id`int(10)无符号非空主键
->)ENGINE=InnoDB默认字符集=utf8mb4 COLLATE=utf8mb4\u unicode\u ci;
查询正常,0行受影响(0.00秒)
mysql>创建表(如果不存在)`grace_事件`(
->`grace_event`int(10)无符号非空主键
->)ENGINE=InnoDB默认字符集=utf8mb4 COLLATE=utf8mb4\u unicode\u ci;
查询正常,0行受影响(0.00秒)
mysql>创建表(如果不存在)`score`(
->`student_id`int(10)无符号非空,
->`event_id`int(10)unsigned NOT NULL,
->`score`int(11)不为空,
->主键(`event\u id`、`student\u id`),
->键“学生id”(“学生id”),
->约束'fk_event_id'外键('event_id`)
->在更新级联上引用“grace\u事件”(“grace\u事件”),
->约束“fk\U学生id”外键