Ограничение, которое позволяет только одной из двух таблиц ссылаться на базовую таблицу - PullRequest
5 голосов
/ 12 июня 2011

у меня 3 таблицы.Базовая таблица, назовите ее Таблица A, и две таблицы, которые ссылаются на Таблицу A, Назовите их Таблица X и Таблица Y. И X, и Y имеют противопоставление внешнего ключа, которое ссылается на Таблицу A. Внешний ключ X и Y также является их собственнымПервичный ключ.

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

Возможно ли это?

Спасибо,

Ответы [ 2 ]

7 голосов
/ 12 июня 2011

Ограничения CHECK с UDF (что является ответом Одеда) плохо масштабируются и имеют плохой параллелизм. Смотрите это:

Итак:

  • создать новую таблицу, скажем TableA2XY
  • здесь есть PK таблицы TableA и столбец char (1) с CHECK, чтобы разрешить только X или Y. И уникальное ограничение для PK тоже A.
  • tableX и tableY имеют новый столбец char (1) с проверкой, разрешающей только X или Y соответственно
  • tableX и tableY имеют свои FK для TableA2XY в обоих столбцах

Это подход с использованием суперключей или подтипов

  • все DRI на основе
  • без триггеров
  • нет файлов с доступом к таблице в ограничениях CHECK.
1 голос
/ 12 июня 2011

Да, это возможно при использовании ограничений CHECK .

Помимо обычного ограничения внешнего ключа, вам потребуется добавить ограничение CHECK в обе ссылочные таблицы, чтобы внешний ключ не использовался в другой ссылочной таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...