Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dwukierunkowe ograniczenie klucza obcego

„Wierzę, że to niemożliwe. Nie możesz utworzyć rekordu adresu, dopóki nie znasz identyfikatora osoby i nie możesz wstawić rekordu osoby, dopóki nie znasz identyfikatora adresu dla pola PrimaryAddressId”.

Na pierwszy rzut oka twierdzenie to wydaje się tak atrakcyjne. Jest to jednak dość propostacyjne.

Jest to bardzo powszechny rodzaj problemu, który dostawcy SQL DBMS próbują zaatakować już być może od dziesięcioleci.

Kluczem jest to, że wszystkie sprawdzanie ograniczeń musi być „odroczone” do momentu zakończenia obu operacji wstawiania. Można to osiągnąć w różnych formach. Transakcje bazodanowe mogą oferować możliwość wykonania czegoś takiego jak "USTAW odroczone sprawdzanie ograniczeń na WŁĄCZONE" i gotowe (gdyby nie fakt, że w tym konkretnym przykładzie prawdopodobnie musiałbyś bardzo mocno zepsuć swój projekt, aby aby móc po prostu ZDEFINIOWAĆ dwa ograniczenia FK, ponieważ jedno z nich po prostu NIE JEST „prawdziwym” FK w sensie SQL!).

Opisane tutaj rozwiązania oparte na wyzwalaczach osiągają zasadniczo ten sam efekt, ale są narażone na wszystkie problemy związane z konserwacją, które istnieją z integralnością wymuszaną przez aplikację.

W swojej pracy Chris Date i Hugh Darwen opisują, co jest prawdziwym rozwiązaniem problemu imo:wielokrotne zadania. Zasadniczo oznacza to możliwość skomponowania kilku odrębnych instrukcji aktualizacji i zmuszenia DBMS do działania na nich tak, jakby była to jedna instrukcja. Implementacje tej koncepcji istnieją, ale nie znajdziesz żadnej, która mówi o SQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Generatory danych dla serwera SQL?

  2. Potrzebujesz zapytania T-SQL, znajdź wszystkie możliwe sposoby

  3. SQL Server:kolumny indeksu używane w podobnym?

  4. 3 sposoby na uzyskanie schematu zbioru wyników w SQL Server

  5. problem z kluczem obcym i indeksem