2011-06-12 6 views
5

Mam 3 tabele. Podstawowa tabela, nazwij ją Tabelą A i dwiema tabelami, które odwołują się do Tabeli A, Wywołaj je Tabelą X i Tabelą Y. Zarówno X, jak i Y mają przypisany klucz obcy, który odwołuje się do Tabeli A. Klucz obcy X i Y jest także ich własnym Główny klucz.Ograniczenie, które zezwala tylko na jedną z dwóch tabel na odwołanie do tabeli podstawowej

Chciałbym wiedzieć, czy istnieje możliwość dodania ograniczenia, które pozwoli, aby jedna z tych tabel zawierała rekrod, który odwołuje się do Tabeli A. Więc jeśli X ma rekord, który odwołuje się do A, to Y nie może mieć jeden i jeśli Y ma rekord, który odwołuje się do A, wówczas X nie może go mieć.

Czy to możliwe?

Dzięki,

+0

Chciałbym być ciekawy twojego przypadku użycia. Jest coś __interesującego__ o twojej strukturze. Masz 3 klucze podstawowe przy użyciu tej samej wartości klucza. – NullRef

+0

Tak, są to trzy tabele do przechowywania kont użytkowników. Istnieją dwa rodzaje kont. Tak więc istnieje tabela podstawowa, która zawiera informacje wspólne dla obu typów kont, a następnie tabelę dla każdego typu konta, które zawiera informacje specyficzne dla tego typu konta. Zatem PK dla każdej tabeli jest UserID, ponieważ uznałem, że to sprawi, że rzeczy będą spójne i ułatwią dostęp do rekordu przez UserID. –

Odpowiedz

7

Ograniczenia CHECK z UDF (co jest odpowiedzią Odeda) nie są dobrze skalowane i mają słabą współbieżność. Zobacz te:

Więc:

  • utworzyć nową tabelę, powiedzmy TableA2XY
  • ten ma PK TableA i char (1) kolumna z CHECK, aby zezwolić na ony X lub Y. I unikalne ograniczenie na PK z A też.
  • Tablex i Tabley mieć nowy char (1) Kolumna z czekiem w celu umożliwienia tylko X lub Y odpowiednio
  • Tablex i Tabley mają FK do TableA2XY na obu kolumnach

To podejście nadkluczem lub podtyp

  • wszystko DRI oparty
  • nie wyzwala
  • nie UDF z dostępem do stołu w ograniczeniach CENY.
+0

Robię prawie to samo co to, co opisałeś. Niedawno przełączyłem się na dodanie kolumny trwałych obliczeń CHAR (1) w mojej tabeli podrzędnej, aby nie wyświetlało się na listach kolumn automatycznie generowanych przez zapytanie SQL –

1

Tak, jest to możliwe przy użyciu CHECK constraints.

Oprócz zwykłego ograniczenia z kluczem obcym konieczne będzie dodanie tabeli CHECK constraint dla obu tabel referencyjnych, aby upewnić się, że klucz obcy nie jest używany w drugiej tabeli odwołań.

+0

CHECK wymaga skalarnego udf, który nie jest bezpieczny i wolny. Zobacz moją odpowiedź, proszę. – gbn

Powiązane problemy