Я испытываю затруднения при выяснении, как создать ограничение внешнего ключа. Моя модель данных фиксируется и из моего управления, она похожа на это:
CREATE TABLE Enquiry
(Enquiry_Ref INTEGER PRIMARY KEY CLUSTERED, Join_Ref INTEGER, EnquiryDate, EnquiryType...)
CREATE TABLE Contact
(Contact_Ref INTEGER PRIMARY KEY CLUSTERED, Surname, Forenames ....)
CREATE TABLE UniversalJoin
(Join_Ref INTEGER, Contact_Ref INTEGER, Rel_Type INTEGER)
Каждый Запрос имеет точно один Контакт. Ссылка между этими двумя является таблицей UniversalJoin где
Enquiry.Join_Ref = UniversalJoin.Join_Ref AND
Rel_Type = 1 AND
UniversalJoin.Contact_Ref = Contact.Contact_Ref
Rel_Type отличается в зависимости от того, какова исходная таблица, таким образом, в случае Запроса, Rel_Type равняется 1, но для другой таблицы это установило бы на N.
Мой вопрос состоит в том, как я создаю ограничение внешнего ключа для осуществления целостности этих отношений? Что я хочу сказать, но не может, быть:
CREATE TABLE Enquiry
...
CONSTRAINT FK_Foo
FOREIGN KEY (Join_Ref)
REFERENCES UniversalJoin (JoinRef WHERE Rel_Type=1)
Вы не можете использовать условные или отфильтрованные внешние ключи в SQL Server
В этих случаях вы можете иметь несколько столбцов FK между (JoinRef, Rel_Type ) и установите ограничение проверки для Rel_Type в UniversalJoin, чтобы оно стало равным 1.
Однако я думаю, что вы пытаетесь создать строку с несколькими родителями, что невозможно.
Возможно, вы захотите взглянуть на Ограничения CHECK
Ограничения CHECK обеспечивают целостность домена, ограничивая значения. целостность домена, ограничивая значения, которые принимаются столбцом. Они похожи на ограничения FOREIGN KEY в том. что они контролируют значения, которые помещаются в столбец. Разница заключается в том. как они определяют, какие значения являются действительными: Ограничения FOREIGN KEY получают список допустимых значений из другой таблицы, а ограничения CHECK определяют допустимые значения из логического выражение, которое не основано на данных в другом столбце.