我偶然发现了innoDB约束的奇怪行为,并且无法找到原因
我有数据表。
下面列出了他们的结构:
CREATE TABLE `contents` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `title` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `fields` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(45) NOT NULL,
`type` varchar(45) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `nameUNIQUE` (`name`),
KEY `name` (`name`),
KEY `type` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `dataTable` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`value` double NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `value_UNIQUE` (`value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `content_data` (
`content_id` int(10) unsigned NOT NULL,
`field_id` int(10) unsigned NOT NULL,
`data_id` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`content_id`,`field_id`,`data_id`),
KEY `fk_content_data_2_idx` (`field_id`),
KEY `fk_content_data_3_idx` (`data_id`),
CONSTRAINT `fk_content_data_1` FOREIGN KEY (`content_id`) REFERENCES `contents` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_content_data_2` FOREIGN KEY (`field_id`) REFERENCES `fields` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_content_data_3` FOREIGN KEY (`data_id`) REFERENCES `dataTable` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
现在,让我们执行两个查询:
第一个查询:
mysql> SELECT * FROM `dataTable` where id=21318;
Empty set (0.00 sec)
我们得到了空集,这是好的,因为dataTable
实际上没有id = 21318的任何行
第二个问题:
mysql> SELECT * FROM `content_data` where data_id=21318;
+------------+----------+---------+
| content_id | field_id | data_id |
+------------+----------+---------+
| 552 | 35 | 21318 |
+------------+----------+---------+
1 row in set (0.00 sec)
这里,最后一个查询给出了data_id = 21318的结果。 WTF!
如何解释这种情况?
为什么约束不起作用?
任何想法,谢谢。
答案 0 :(得分:2)
如果打电话
def method(name)
return "Hello + #{name}"
end
method("Amy")
然后关闭FK检查。谁知道,这可能是你现在的系统状态。让他们打开
SET FOREIGN_KEY_CHECKS=0;
请注意以下内容。只是重新打开检查不会重新验证参照完整性。一个人需要SET FOREIGN_KEY_CHECKS=1;
。
简单地发布架构几乎没有说您受到保护。
意思是,我可以关闭我的约束,使用系统,删除一些数据,执行LOAD DATA INFILE(简而言之,弄乱我的数据),然后使用模式运行到Stackoverflow并说“gosh这是怎么发生的”
现在你的系统处于什么状态并不重要。重要的是当时的情况。