Mam tabelę, która ma kilka kolumn identyfikatora do innych tabel.
Chcę, aby klucz obcy wymusił integralność tylko wtedy, gdy wstawię tam dane. Jeśli zrobię aktualizację w późniejszym czasie, aby zapełnić tę kolumnę, powinien również sprawdzić ograniczenie.
(Prawdopodobnie zależy to od serwera bazy danych, używam typu tabeli MySQL i InnoDB)
Uważam, że jest to uzasadnione oczekiwanie, ale poprawcie mnie, jeśli się mylę.
sql
mysql
database
foreign-keys
giętarka
źródło
źródło
Odpowiedzi:
Tak, możesz wymusić ograniczenie tylko wtedy, gdy wartość nie jest równa NULL. Można to łatwo przetestować za pomocą następującego przykładu:
Pierwsza wstawka przejdzie, ponieważ wstawiamy NULL w
parent_id
. Druga wstawka kończy się niepowodzeniem z powodu ograniczenia klucza obcego, ponieważ próbowaliśmy wstawić wartość, która nie istnieje wparent
tabeli.źródło
parent_id INT NULL
część jest (mówiona) równaparent_id int default null
int
zamiastInteger
w członkach klasy, domyślna wartość nigdy nie będzie wynosić zero, ale będzie równa 0 i nie spełnisz warunku .Odkryłem, że podczas wstawiania wartości kolumny zerowej musiały być wyraźnie zadeklarowane jako NULL, w przeciwnym razie dostałbym błąd naruszenia ograniczenia (w przeciwieństwie do pustego ciągu).
źródło
INSERT INTO {table} {list_of_columns}
? Bo to dla mnie prawda; pominięcie wzmianki o kolumnie powoduje błąd, ale włączenie i jawne ustawienie wartości NULL naprawia błąd. Jeśli mam rację, myślę, że komentarz @ Gary'ego nie ma zastosowania (ponieważ nie miałeś na myśli pustego ciągu), ale @Kevin Coulombe może być pomocny ...Tak, zadziała tak, jak tego oczekujesz. Niestety wydaje mi się, że mam problem ze znalezieniem wyraźnego stwierdzenia tego w podręczniku MySQL .
Klucze obce oznaczają, że wartość musi istnieć w drugiej tabeli. NULL odnosi się do braku wartości, więc kiedy ustawisz kolumnę na NULL, nie ma sensu próbować wymuszać na tym ograniczeń.
źródło
Powyższe działa, ale nie działa. Zwróć uwagę na KASKAD ON DELETE
źródło
Tak, wartość może wynosić NULL, ale musisz być jawny. Zetknąłem się już z tą samą sytuacją i łatwo zapomnieć DLACZEGO to się dzieje, więc trochę trzeba pamiętać, co trzeba zrobić.
Jeśli przesłane dane zostaną rzutowane lub zinterpretowane jako pusty ciąg, nie powiedzie się. Jednak poprzez bezpośrednie ustawienie wartości NULL podczas WSTAWIANIA lub AKTUALIZACJI, możesz zacząć.
Ale to jest zabawa z programowaniem, prawda? Tworzenie własnych problemów, a następnie ich rozwiązywanie! Twoje zdrowie!
źródło
Innym sposobem obejścia tego byłoby wstawienie elementu DEFAULT do drugiej tabeli. Na przykład każde odniesienie do uuid = 00000000-0000-0000-0000-000000000000 w drugiej tabeli wskazuje na brak działania. Musisz także ustawić wszystkie wartości tego identyfikatora na „neutralne”, np. 0, pusty ciąg, null, aby nie wpływać na logikę kodu.
źródło
Utknąłem również w tej sprawie. Ale rozwiązałem po prostu definiując klucz obcy jako
unsigned integer
. Znajdź poniższy przykładźródło