【发布时间】:2019-06-18 21:53:48
【问题描述】:
在 MySQL Ver 14.14 Distrib 5.7.25 上,对于 Linux (x86_64),默认设置 @@GLOBAL.foreign_key_checks=1 似乎不起作用,因为我尝试将 INSERT 包含在父级中不存在的值的行表的键和INSERT 成功。
为什么我必须SET FOREIGN_KEY_CHECKS=1,即使默认设置了foreign_key_checks=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_id,student_id,score) VALUES(9999,9999,0); 得到了这个...
Query OK, 1 row affected (0.01 sec)
所以,为了弄清楚为什么 INSERT 成功而应该不成功,我阅读了以下网页...
- 'SET foreign_key_checks = 1' does not work again
- Foreign key not working in MySQL: Why can I INSERT a value that's not in the foreign column?
...但他们似乎都没有解释INSERT 为何/如何成功(不幸的是)。
我确保我的 3 张桌子满足以下所有条件:
- 外键必须是
INT UNSIGNED。是的。 - 默认存储引擎必须是
InnoDB。是的。 - 对每个外键声明使用
ON UPDATE CASCADE。是的。 - phpmyadmin 显示
foreign key checks设置为ON。是的。
...和SELECT @@GLOBAL.foreign_key_checks 显示...
mysql> SELECT @@GLOBAL.foreign_key_checks;
+-----------------------------+
| @@GLOBAL.foreign_key_checks |
+-----------------------------+
| 1 |
+-----------------------------+
通过以上所有设置,mysql> INSERT INTO score (event_id,student_id,score) VALUES(9999,9999,0); 仍然成功。
直到我做了SET FOREIGN_KEY_CHECKS=1,INSERT终于失败了……
ERROR 1452 (23000):无法添加或更新子行:外键 约束失败(
sampdb.score, CONSTRAINTfk_event_idFOREIGN 关键 (event_id) 参考grace_event(event_id) 更新 级联)
为什么我必须SET FOREIGN_KEY_CHECKS=1(显然)已经默认设置为 1? 默认@@GLOBAL.foreign_key_checks 设置没有任何意义吗?这是一个错误吗?
【问题讨论】:
-
什么返回
SELECT @@GLOBAL.foreign_key_checks, @@SESSION.foreign_key_checks;?. -
@wchiquito 每个都返回
1。 -
@wchiquito 我猜这意味着在我运行
SET FOREIGN_KEY_CHECKS=1之前必须将@@SESSION.foreign_key_checks设置为0。对吗?
标签: mysql