To wydaje się być częstym błędem, ale dla mojego życia nie mogę tego zrozumieć.MySQL - Nie można dodać lub zaktualizować wiersza podrzędnego: klucz obcy nie powiódł się
Mam zestaw tabel użytkowników InnoDB w MySQL, które są powiązane za pomocą klucza obcego; tabela nadrzędna oraz zestaw tabel podrzędnych przechowujących adresy e-mail, czynności itp. Wszystkie są powiązane z tabelą rodzica user
za pomocą klucza obcego, uid
, przy czym wszystkie klucze nadrzędne i podrzędne to int(10)
.
Wszystkie tabele dzieci mają wartość uid
z klucz obcy wskazując user.uid
i ustawiony ON DELETE CASCADE
i ON UPDATE CASCADE
.
Po usunięciu użytkownika z user
wszystkie pozycje z ograniczeniami podrzędnymi zostaną usunięte. Jednak, kiedy próbuję aktualizować wartość user.uid
, to wyniki w następujący błąd, zamiast kaskadowe z uid
zmiany w tabelach podrzędnych:
#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)
Mam wrażenie, że musi być brakujące coś oczywistego tutaj. Usunięcie ograniczenia klucza za pomocą user_email
i próba zaktualizowania wartości w user
powoduje ten sam błąd, ale w przypadku kolejnej alfabetycznej tabeli podrzędnej user
, więc nie uważam, że jest to błąd specyficzny dla tabeli.
EDIT:
Dodawanie w wynikach z 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
'POKAŻ STATUS INNODB SIECI ' –
Głosowanie w celu przeniesienia tego do dba. –