Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Bedingter Fremdschlüssel in SQL

Sie können PERSISTED COMPUTED verwenden Spalten mit einer case-Anweisung, aber am Ende bringt es Ihnen nichts als Overhead.

Die beste Lösung wäre, sie zunächst als drei unterschiedliche Werte zu modellieren.

CREATE TABLE Mails (MailID INTEGER PRIMARY KEY)
CREATE TABLE Phones (PhoneID INTEGER PRIMARY KEY)
CREATE TABLE Emails (EmailID INTEGER PRIMARY KEY)

CREATE TABLE PartyChannel (
  ID INTEGER NOT NULL
  , ChannelID INTEGER NOT NULL
  , ChannelType CHAR(1) NOT NULL
  , MailID AS (CASE WHEN [ChannelType] = 'M' THEN [ChannelID] ELSE NULL END) PERSISTED REFERENCES Mails (MailID)
  , PhoneID AS  (CASE WHEN [ChannelType] = 'P' THEN [ChannelID] ELSE NULL END) PERSISTED REFERENCES Phones (PhoneID)
  , EmailID AS  (CASE WHEN [ChannelType] = 'E' THEN [ChannelID] ELSE NULL END) PERSISTED REFERENCES Emails (EmailID)
)

Haftungsausschluss

nur weil du es kannst, heißt das nicht, dass du es solltest.