gpt4 book ai didi

mysql - 外键约束应该提示但不知何故不是

转载 作者:行者123 更新时间:2023-11-29 00:58:19 25 4
gpt4 key购买 nike

除其他外,我有三个表:accountaddressaccount_addressaccount_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. 我误解了我所看到的
  2. 我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com