在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秒)
因此,为了弄清楚为什么插入
不应该成功,但却成功了,我阅读了以下网页...
int无符号
。是。InnoDB
。是的。on UPDATE cascade
。是。外键检查
在上设置为。是。
...和
选择@@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)中;
仍然成功。
我无法再现这个问题:
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”代码: 这是默认代码: 以下是输出: 我很有信心我的代码是正确的,但是如果我缺少什么,请告诉我如何修复它,谢谢。