当前位置: 首页 > 知识库问答 >
问题:

默认情况下,MySQL foriegn_key_checks=1,但不工作

逄兴昌
2023-03-14

在MySQL Ver 14.14 Distrib 5.7.25上,对于Linux(x86_64),默认设置@@global.foreign_key_checks=1似乎不起作用,因为我试图插入一行,其中包含父表键中不存在的值,而插入成功了。

为什么我必须设置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输入到score(event_id,student_id,score)值(9999,9999,0);中,得到了这个...

查询确定,有1行受影响(0.01秒)

因此,为了弄清楚为什么插入不应该成功,但却成功了,我阅读了以下网页...

    null
  • 外键必须为int无符号。是。
  • 默认存储引擎必须为InnoDB。是的。
  • 对每个外键声明使用on UPDATE cascade。是。
  • phpMyAdmin显示外键检查在上设置为。是。

...和选择@@global.foreign_key_checks显示...

mysql> SELECT @@GLOBAL.foreign_key_checks;
+-----------------------------+
| @@GLOBAL.foreign_key_checks |
+-----------------------------+
|                           1 |
+-----------------------------+

使用上述所有设置,MySQL>插入到score(event_id,student_id,score)值(9999,9999,0)中;仍然成功。


共有1个答案

邵宏达
2023-03-14

我无法再现这个问题:

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.25    |
+-----------+
1 row in set (0.00 sec)

mysql> SELECT @@GLOBAL.foreign_key_checks, @@SESSION.foreign_key_checks;
+-----------------------------+------------------------------+
| @@GLOBAL.foreign_key_checks | @@SESSION.foreign_key_checks |
+-----------------------------+------------------------------+
|                           1 |                            1 |
+-----------------------------+------------------------------+
1 row in set (0.00 sec)

mysql> DROP TABLE IF EXISTS `student`, `grace_event`, `score`;
Query OK, 0 rows affected, 3 warnings (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `student` (
    ->   `student_id` int(10) unsigned NOT NULL PRIMARY KEY
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `grace_event` (
    ->   `grace_event` int(10) unsigned NOT NULL PRIMARY KEY
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `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` (`grace_event`) 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;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `score`
    ->   (`event_id`, `student_id`, `score`)
    -> VALUES
    ->   (9999, 9999, 0);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key
                    constraint fails (`test`.`score`, CONSTRAINT
                    `fk_event_id` FOREIGN KEY (`event_id`) REFERENCES
                    `grace_event` (`grace_event`) ON UPDATE CASCADE)
 类似资料:
  • 默认情况下,我们的路由器是Yaf_Router, 而默认使用的路由协议是Yaf_Route_Static,是基于HTTP路由的, 它期望一个请求是HTTP请求并且请求对象是使用Yaf_Request_Http

  • 问题内容: 谁能向我解释为什么Hibernate 默认情况下不设置注释,而是允许实体根据当前设置的属性生成INSERT? 什么是不使用的原因,因此默认情况下包括所有实体属性? 问题答案: @ jb-nizet说了什么。 另外,在我的书中是个坏主意。 从生成的SQL跳过空字段,很快您将发现自己处于声明列的情况,这实际上导致持久数据与休眠知道的实体数据不同。这会造成挫败感,并可能使您诉诸昂贵的电话。

  • 问题内容: 众所周知,根据JLS7 p.4.12.5, 每个实例变量均使用默认值初始化。例如(1): 但是我一直认为,这样的类实现(2): 绝对等于示例(1)。我期望,复杂的Java编译器会看到(2)中的所有这些初始化值都是多余的,并忽略了它们。 但是突然对于这两个类,我们有两个不同的字节码。 例如(1): 例如(2): 问题是: 为什么?但这是显而易见的要优化的事情。什么原因? UPD: 我使用

  • 问题内容: 我有一个关于乐观锁定Hibernate的问题。我试图深入了解Hibernate的乐观锁定,但是我有一个疑问。Hibernate使用版本方法(整数或时间戳)来实现乐观锁定。要进行配置,您可以使用@Version批注(或xml配置)并创建一个version属性。另一个选项是使用optimistic- lock =“ all”属性进行配置而不进行版本控制。 我的问题是,如果您没有定义任何版本

  • 问题内容: 我有一个简单的SSIS程序包,在该程序包中,我将数据从平面文件导入SQL Server表(SQL Server 005)。文件包含70k行,表没有主键。导入成功,但是当我打开SQL Server表时,行的顺序与文件的顺序不同。仔细观察后,我看到表中的数据默认情况下按第一列排序。为什么会这样呢?以及如何避免默认排序?谢谢。 问题答案: 除非您在SQL查询中指定,否则您不能依赖排序。SQL

  • 所以基本上我有一个学校的项目,它包含一个time循环中的开关语句。 假设我输入“1”,它在大小写“1”中运行代码。然后它应该在之后中断。但默认代码也总是运行。 这是案例“1”代码: 这是默认代码: 以下是输出: 我很有信心我的代码是正确的,但是如果我缺少什么,请告诉我如何修复它,谢谢。