除其他外,我有三个表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 不应该在某个时候告诉我我的外键约束失败了吗?!
我只看到两种可能性:
- 我误解了我所看到的
- 我的 DBMS 在根本上行为不端
我当然希望 #1 是这种情况,但我不知道我可能会误解什么。这对我来说是一个最高级别的谜。任何想法将不胜感激。