Связать поле нескольких таблиц с одним и тем же внешним ключом в TSQL - PullRequest
1 голос
/ 07 декабря 2011

Я действительно не знаю, возможно ли это логически, но у меня есть таблица:

PERSON: Id (PK), Name, SoldTo (FK), ShipTo (FK), BillTo (FK)

ADDRESS: AddrId (PK), Street, Number, Town, Type

Type в ADDRESS будет содержать строку, описывающую тип адреса. Я хотел бы связать SoldTo, ShipTo и BillTo с AddrId. Конечно, они также могут указывать на одну и ту же запись.

Однако в SSMS это мне запрещено.

Кто-нибудь знает обходной путь или лучший способ сделать это? Спасибо

UPDATE

Чтобы понять, что я имею в виду под «SSMS запрещает мне это делать» взгляните на скриншот по ссылке ниже. Рассмотрим CMF_ContactInfo как ADDRESS и CMF_AccountInfo как PERSON. Как видите, я могу добавить ContactId к отношениям только один раз ...

Диалог таблиц и столбцов SSMS http://img850.imageshack.us/img850/24/69338662.jpg

Ответы [ 2 ]

4 голосов
/ 07 декабря 2011

Не знаю, как вы пытаетесь сделать это в SSMS (возможно, вы пробуете некоторые интерактивные инструменты, я мало о них знаю), но именно так вы можете делать то, что вы хотите, в простом Transact-SQL:

CREATE TABLE Address (
  AddrId int CONSTRAINT PK_Address PRIMARY KEY,
  Street varchar(50),
  Number int,
  Town varchar(50),
  Type int
);

CREATE TABLE Person (
  Id int PRIMARY KEY,
  Name varchar(100),
  SoldTo int NOT NULL CONSTRAINT FK_Address_SoldTo FOREIGN KEY REFERENCES Address (AddrId),
  ShipTo int NOT NULL CONSTRAINT FK_Address_ShipTo FOREIGN KEY REFERENCES Address (AddrId),
  BillTo int NOT NULL CONSTRAINT FK_Address_BillTo FOREIGN KEY REFERENCES Address (AddrId)
);

Не уверен насчет реальных типов, но вы поняли идею. Также вы можете удалить NOT NULL там, где это не нужно (или добавить его, если необходимо).

2 голосов
/ 07 декабря 2011

Вы должны добавить несколько отношений!(с разными именами) Так же, как если бы это были разные таблицы.

...