Это, кажется, обычная ошибка, но для жизни меня я не могу понять этого.
У меня есть набор пользовательских таблиц InnoDB в MySQL, связанных друг с другом через внешний ключ; родительская таблица user
и набор дочерних таблиц, которые хранят адреса электронной почты, действия и т.д. Все они привязаны к родительской таблице user
внешним ключом uid
со всеми родительскими и дочерними ключами int(10)
.
Все дочерние таблицы имеют значение uid
с ограничением внешнего ключа, указывающим на user.uid
, и установите ON DELETE CASCADE
и ON UPDATE CASCADE
.
Когда я удаляю пользователя из user
, все дочерние ограниченные записи удаляются. Однако, когда я пытаюсь обновить значение user.uid
, это приводит к следующей ошибке, а не к каскадированию изменения uid
дочерних таблиц:
#1452 - Cannot add or update a child row: a foreign key constraint fails (`accounts`.`user_email`, CONSTRAINT `user_email_ibfk_2` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE)
У меня такое чувство, что я должен упустить что-то очевидное здесь. Удаление ограничения ключа с помощью user_email
и попытка обновления значения в user
приводит к той же ошибке, но для следующей дочерней таблицы user
в алфавитном порядке, поэтому я не верю, что это ошибка, связанная с таблицей.
EDIT:
Добавление результатов из SHOW ENGINE INNODB STATUS
:
------------------------
LATEST FOREIGN KEY ERROR
------------------------
121018 22:35:41 Transaction:
TRANSACTION 0 5564387, ACTIVE 0 sec, process no 1619, OS thread id 2957499248 updating or deleting, thread declared inside InnoDB 499
mysql tables in use 1, locked 1
17 lock struct(s), heap size 2496, 9 row lock(s), undo log entries 2
MySQL thread id 3435659, query id 24068634 localhost root Updating
UPDATE `accounts`.`user` SET `uid` = '1' WHERE `user`.`uid` = 306
Foreign key constraint fails for table `accounts`.`user_email`:
,
CONSTRAINT `user_email_ibfk_2` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE
Trying to add in child table, in index `uid` tuple:
DATA TUPLE: 2 fields;
...
A bunch of hex code
But in parent table `accounts`.`user`, in index `PRIMARY`,
the closest match we can find is record:
...
A bunch of hex code