默认情况下,MySQL外键检查=1,但不工作

默认情况下,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 ************************

在MySQL版本14.14发行版5.7.25上,对于Linux(x86_64),默认设置
@@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”外键