Jak korzystać z RESTRICT dla klucza obcego w mysql?


11

W strukturze bazy danych

  CREATE TABLE Country (
  name varchar(40) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE City (
  name varchar(40) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE Map (
  country varchar(40) NOT NULL,
  city varchar(100) NOT NULL,
  PRIMARY KEY  (country,city),
  FOREIGN KEY (country) REFERENCES Country (name) ON DELETE CASCADE,
  FOREIGN KEY (city) REFERENCES City (name) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Oczekuję, że usunę Cityelement nadrzędny , pozostawiając odpowiednią wartość nietkniętą przez te trzy równe polecenia

  FOREIGN KEY (city) REFERENCES City (name) ON DELETE NO ACTION
  FOREIGN KEY (city) REFERENCES City (name) ON DELETE RESTRICT
  FOREIGN KEY (city) REFERENCES City (name)

Ale kiedy używasz NO ACTIONOR RESTRICTlub pomijasz ON DELETE. MySQL nie pozwala mi usunąć z kolumny nadrzędnej z tym błędem:

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails 
('test'.'Map', CONSTRAINT 'Map_ibfk_2' FOREIGN KEY ('city') REFERENCES 'City'('name')
 ON DELETE RESTRICT

Gdzie się mylę? Czy to nie SQL odpowiada za NO ACTIONusunięcie rodzica i pozostawienie dziecka sierotą?

Odpowiedzi:


13

Zgodnie z dokumentacją MySQL na DELETE RESTRICT

• OGRANICZENIE: Odrzuca operację usuwania lub aktualizacji dla tabeli nadrzędnej. Określenie OGRANICZENIA (lub BRAK DZIAŁANIA) jest takie samo, jak pominięcie klauzuli ON DELETE lub ON UPDATE.

Jeśli chodzi o BRAK DZIAŁAŃ

• BRAK DZIAŁANIA: słowo kluczowe ze standardowego SQL. W MySQL, odpowiednik RESTRICT. InnoDB odrzuca operację usuwania lub aktualizacji dla tabeli nadrzędnej, jeśli w odnośnej tabeli znajduje się powiązana wartość klucza obcego. Niektóre systemy baz danych mają odroczone kontrole, a BRAK DZIAŁANIA to kontrola odroczona. W MySQL ograniczenia klucza obcego są sprawdzane natychmiast, więc ŻADNA AKCJA nie jest taka sama jak RESTRICT.

USUŃ OGRANICZENIE chroni rodzica przed usunięciem, a nie dzieci.


5

Jeśli chcesz usunąć rodzica i zostawić dziecko, prawdopodobnie potrzebujesz ON DELETE SET NULLopcji:

SET NULL: Usuń lub zaktualizuj wiersz z tabeli nadrzędnej i ustaw kolumnę lub kolumny klucza obcego w tabeli podrzędnej na NULL. Obsługiwane są zarówno klauzule ON DELETE SET NULL, jak i ON UPDATE SET NULL.

Jeśli określisz akcję SET NULL, upewnij się, że kolumny w tabeli potomnej nie zostały zadeklarowane jako NOT NULL.

W ostatnim zdaniu jest dużo „nie”, więc upewnij się, że parent_id może mieć wartość NULL.

Zobacz także pokrewne pytanie: Do czego służy funkcja SET NULL w ograniczeniach usuwania / aktualizacji kluczy obcych?

Definiując klucz obcy, powiedziałeś bazie danych, aby nie akceptowała wpisów w tabeli podrzędnej, które nie mają odpowiadającej wartości w obiekcie nadrzędnym.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.