У меня есть, помимо прочего, три таблицы: 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 связан с шестью различными учетными записями (одна учетная запись, что интересно, имеет тот же идентификатор, что и адрес).Но проверьте это:
select * from account where id in (15116, 37033, 62325, 71857, 93774, 119066)
НЕТ результатов! Разве моя СУБД не должна была когда-нибудь сказать мне, что у меня сбой ограничения внешнего ключа?!
Я вижу только две возможности:
- I 'я неверно истолковываю то, что вижу
- Моя СУБД ведет себя некорректно
Я уверен, что надежда № 1 такова, но я не знаю, что я мог неправильно истолковать,Это загадка для меня самого высокого порядка.Любые мысли будут с благодарностью.