2012-10-19 16 views
12

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 
+0

'POKAŻ STATUS INNODB SIECI ' –

+0

Głosowanie w celu przeniesienia tego do dba. –

Odpowiedz

1

W związku z niepowiązanym zadaniem, niedawno podniosłem naszą bazę danych MySQL pod numerem MySQL Workbench, a podczas przeglądania relacji tabeli dla powyższych tabel zauważyłem "zduplikowane" i/lub fałszywe relacje, które wcześniej w jakiś sposób przeoczyłem (nie były one dostępne) pojawia się w PHPMyAdmin FWIW). Usunięcie tych dodatkowych relacji natychmiast rozwiązało problem.

8

Ponieważ nie dały definicje tabel, trudno odgadnąć. Ale wygląda na to, że próbujesz zmodyfikować klucz obcy w tabeli podrzędnej. AFAIK, jest to nielegalne, możesz modyfikować je z rodzica, ale nie z tabeli podrzędnej.

Rozważmy następujący przykład:

CREATE TABLE parent (
    parent_id INT NOT NULL, 
    parent_data int, 

    PRIMARY KEY (parent_id) 
) ENGINE=INNODB; 

CREATE TABLE child1 (
    child1_id INT, 
    child1_data INT, 
    fk_parent_id INT, 

    INDEX par_ind1 (fk_parent_id), 

    FOREIGN KEY (fk_parent_id) 
    REFERENCES parent(parent_id) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE 
) ENGINE=INNODB; 

CREATE TABLE child2 (
    child2_id INT, 
    child2_data INT, 
    fk_parent_id INT, 

    INDEX par_ind2 (fk_parent_id), 

    FOREIGN KEY (fk_parent_id) 
    REFERENCES parent(parent_id) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE 
) ENGINE=INNODB; 

INSERT INTO parent 
    (parent_id, parent_data) 
    VALUES 
    (1, 11), 
    (2, 12); 

INSERT INTO child1 
    (child1_id, child1_data, fk_parent_id) 
    VALUES 
    (101, 1001, 1), 
    (102, 1002, 1), 
    (103, 1003, 1), 
    (104, 1004, 2), 
    (105, 1005, 2); 

INSERT INTO child2 
    (child2_id, child2_data, fk_parent_id) 
    VALUES 
    (106, 1006, 1), 
    (107, 1007, 1), 
    (108, 1008, 1), 
    (109, 1009, 2), 
    (110, 1010, 2); 

to jest dozwolony:

UPDATE parent 
    SET parent_id = 3 WHERE parent_id = 2; 

SELECT * FROM parent; 
SELECT * FROM child1; 
SELECT * FROM child2; 

Ale tak nie jest, ponieważ modyfikuje FK rodzica z tabeli dziecko:

UPDATE child1 
    SET fk_parent_id = 4 WHERE fk_parent_id = 1; 

Otrzymuje błąd bardzo podobny do twojego błędu:

Cannot add or update a child row: a foreign key constraint fails (`db_2_b43a7`.`child1`, CONSTRAINT `child1_ibfk_1` FOREIGN KEY (`fk_parent_id`) REFERENCES `parent` (`parent_id`) ON DELETE CASCADE ON UPDATE CASCADE): 
+0

Dzięki. Aktualizuję tabelę nadrzędną - zobacz zapytanie z dumpa, które opublikowałem: 'UPDATE \' accounts \ '. \' User \ 'SET \' uid \ '= '1' WHERE \' user \ '. \' Uid \ '= 306'. 'user' jest tabelą nadrzędną i wyzwala ten błąd. –

+0

Czy możesz zamieścić więcej informacji o swoim schemacie? Lub zmodyfikuj powyższy przykład, aby uzyskać ten sam błąd? – walrii

4

Miałem do czynienia z tym samym problemem podczas tworzenia obcych ograniczeń na stole. Prostym sposobem wyjścia z tego problemu jest najpierw zrobienie kopii zapasowej tabeli rodzica i dziecka, a następnie obcięcie tabeli podrzędnej i próba nawiązania relacji. mam nadzieję, że rozwiąże to problem.

-1

Mam nadzieję, że pomoże to każdemu, kto ma ten sam błąd podczas importowania danych CSV do powiązanych tabel.W moim przypadku tabela nadrzędna była OK, ale dostałem błąd podczas importowania danych do tabeli podrzędnej zawierającej klucz obcy. Po tymczasowym usunięciu ograniczenia klucza foregn na tabeli podrzędnej udało mi się zaimportować dane i niespodziewanie znalazłem niektóre wartości w kolumnie FK mające wartości 0 (oczywiście to powodowało błąd, ponieważ tabela nadrzędna nie miała takie wartości w kolumnie PK). Przyczyną było to, że dane w mojej kolumnie CSV poprzedzające kolumnę FK zawierały przecinki (które używałem jako ograniczniki pola). Zmiana ogranicznika dla mojego pliku CSV rozwiązała problem.

9

I rozwiązać mój „ograniczenie klucza obcego nie” problemy dodając następujący kod do początku kodu SQL (to było dla importowania wartości do tabeli)

SET @[email protected]@CHARACTER_SET_CLIENT; 
SET @[email protected]@CHARACTER_SET_RESULTS; 
SET @[email protected]@COLLATION_CONNECTION; 
SET NAMES utf8; 
SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO'; 
SET @[email protected]@SQL_NOTES, SQL_NOTES=0; 

następnie dodanie tego kodu do koniec pliku

SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 
SET [email protected]_CHARACTER_SET_CLIENT; 
SET [email protected]_CHARACTER_SET_RESULTS; 
SET [email protected]_COLLATION_CONNECTION; 
SET [email protected]_SQL_NOTES; 
+0

działa pięknie –

+0

to działa !!! dziękuję – tiveor

+0

ŻYCIE SAVER MAN, DZIĘKI –

0

Taki błąd podczas aktualizacji może być spowodowane różnicą w zestawie znaków i zestawień, więc upewnij się, że są takie same dla obu tabel.

Powiązane problemy