дополнительные внешние ключи, один из которых должен быть обязательным - как? - PullRequest
2 голосов
/ 06 октября 2011

У меня есть таблица, которая имеет два необязательных внешних ключа, каждый для своей таблицы и один из которых должен быть заполнен, но не имеет значения, какой именно.Я думал об использовании триггера, чтобы усилить это «ограничение», но мне кажется, что делать это таким образом неправильно.Я не могу изменить дизайн таблиц, поэтому я застрял с ним.

Мы используем Oracle 10g

Есть ли лучший способ сделать это?

РЕДАКТИРОВАТЬ:Я случайно пропустил некоторую информацию.Необходимо заполнить хотя бы один столбец, и МОЖЕТ быть заполнен ТОЛЬКО один столбец.

Ответы [ 2 ]

6 голосов
/ 06 октября 2011

Использовать проверочное ограничение.Если они оба могут быть заполнены, то:

 alter table t add constraint c check (col1 is not null or col2 is not null)

Или если они взаимоисключающие:

 alter table t add constraint c check ((col1 is not null and col2 is null
                                       or (col2 is not null and col1 is null))
0 голосов
/ 06 октября 2011

Создайте другую таблицу, которая будет родительской для двух таблиц, на которые вы ссылаетесь в данный момент. Ссылка на эту новую таблицу только с одним внешним ключом (без значения NULL) вместо двух. Другими словами, используйте шаблон супертипа / подтипа.

...