Stworzyłem tabelę, w której cat_parent_id
jest kluczem obcym jest ograniczony przez klucz podstawowy cat_id
, używając tego:
CREATE TABLE categories (
cat_id SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
cat_parent_ID SMALLINT,
cat_name VARCHAR(40)
INDEX cat_id(cat_id),
FOREIGN KEY(cat_id) REFERENCES categories(cat_id),
);
Kiedy próbuję wstawić rekord, gdzie cat_parent_ID
jest NULL
, Pojawia się błąd:
#1452 - Cannot add or update a child row: a foreign key constraint fails (`myDatabase`.`categories`, CONSTRAINT `categories_ibfk_1` FOREIGN KEY (`cat_id`) REFERENCES `categories` (`cat_id`))
W jaki sposób ograniczenie klucza obcego może się nie powieść, gdy na początku nie ma klucza obcego? Czy ograniczenie jest możliwe tylko wtedy, gdy wartość null jest niedozwolona?
Mogę tylko wstawiać rekordy z powodzeniem, jeśli wyłączę ograniczenie, co nie jest tym, czego chcę. potrzebuję parent_id
być opcjonalne, a jeśli ma wartość, to musi istnieć cat_id
tylko
Odpowiedzi:
0 dla odpowiedzi № 1Spowoduje to utworzenie okrągłego klucza obcego, który uniemożliwi wstawienie do tabeli.
FOREIGN KEY(cat_id) REFERENCES categories(cat_id),
EDYCJA: Być może chciałeś włączyć PK cat_parent_id
?
0 dla odpowiedzi nr 2
Masz jeden rekord główny, który nie ma rodzica, w tym przypadku musisz najpierw wyłączyć ograniczenia klucza obcego.
SET FOREIGN_KEY_CHECKS=0;
Wstaw rekord.
Nie zapomnij o ponownym ograniczeniu klucza obcego
SET FOREIGN_KEY_CHECKS=1;
Następnie od teraz upewnij się, że wstawki zawierają istniejący element nadrzędny.
W jaki sposób ograniczenie klucza obcego może się nie powieść, gdy nie ma klucza obcego najpierw? Czy ograniczenie jest możliwe tylko wtedy, gdy wartość null jest niedozwolona?
Jeśli chcesz dodać inne rekordy, które nie mają wartości FK, upewnij się, że dozwolona jest wartość NULL.