- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
除其他外,我有三个表:account
、address
和 account_address
。 account_address
表有一个 account_id
和一个 address_id
。这是标准的多对多关系。
我有一个令人费解的情况,我有一个 account_address
记录指向一个不存在的 account
。因为我在 account_address.account_id
上有一个指向 account
的外键,所以这不应该发生,对吧?
现在让我证明这件本应不可能的事情正在发生。首先,我将向您展示我的表定义:
CREATE TABLE `account_address` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`account_id` bigint(20) NOT NULL,
`address_id` bigint(20) NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `fk_account_address_account_id` (`account_id`),
KEY `fk_account_address_address_id` (`address_id`),
KEY `index_account_address_account_id` (`account_id`) USING BTREE,
KEY `index_account_address_address_id` (`address_id`) USING BTREE,
CONSTRAINT `fk_account_address_account_id` FOREIGN KEY (`account_id`) REFERENCES `account` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_account_address_address_id` FOREIGN KEY (`address_id`) REFERENCES `address` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=697173 DEFAULT CHARSET=latin1
看到了吗? FOREIGN KEY (account_id) REFERENCES account (id)
。
现在这里有一些显示约束失败的查询:
select aa.account_id
from account_address aa
where aa.address_id = 15116
该查询给了我以下结果:
15116
37033
62325
71857
93774
119066
显然地址 15116 与六个不同的帐户相关联(一个帐户,有趣的是与地址具有相同的 ID)。但是检查一下:
select * from account where id in (15116, 37033, 62325, 71857, 93774, 119066)
没有结果! 我的 DBMS 不应该在某个时候告诉我我的外键约束失败了吗?!
我只看到两种可能性:
我当然希望#1 是这样,但我不知道我可能会误解什么。这对我来说是最高级别的谜。任何想法将不胜感激。
最佳答案
约束会阻止任何“邪恶”的行为,但不会追溯确保一切正常。由于事情发生的顺序,您可以像许多导入脚本一样,将这些约束的检查设置为 0。
因此,如果由于某种原因信息不正确,就会发生这种情况。那么您的 DBMS 就不会出现异常,您也不会误解。
所以我选择选项 3:某些导入或插入行为不正常,可能使用“set foreign_key_checks = 0”。或者是旧数据。
(来自手册:
mysql> SET foreign_key_checks = 0;
mysql> SOURCE dump_file_name;
mysql> SET foreign_key_checks = 1;
)
关于mysql - 外键约束应该提示但不知何故不是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4970820/
我是一名优秀的程序员,十分优秀!