Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Clé étrangère conditionnelle en SQL

Vous pouvez utiliser PERSISTED COMPUTED colonnes avec une instruction case mais à la fin, cela ne vous achète rien d'autre que des frais généraux.

La meilleure solution serait de les modéliser comme trois valeurs distinctes pour commencer.

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)
)

Avis de non-responsabilité

ce n'est pas parce que vous pouvez que vous devriez.