Вопрос об ограничении внешнего ключа Oracle - PullRequest
1 голос
/ 15 апреля 2011

Мне нужно определить ограничение внешнего ключа для некоторой таблицы B, где идентификатор столбца должен быть в наборе таблицы A.ID ИЛИ это может быть NULL (это также будет допустимым значением),

(столбец A.ID не может быть НЕДЕЙСТВИТЕЛЕН одновременно).

Стоит ли использовать предложение CHECK?

UPD: Извините, я написал неправильно.Я имел в виду:

Мне нужно определить ограничение внешнего ключа для некоторой таблицы B, где идентификатор столбца должен быть в наборе таблицы A.ID ИЛИ это может быть ноль (это также будет допустимым значением).

(столбец A.ID не может быть одновременно ноль ).

Ответы [ 3 ]

1 голос
/ 15 апреля 2011

Да.

Ограничение внешнего ключа не будет работать, если вы не вставите строку с A.ID = 0.

0 голосов
/ 15 апреля 2011

Вам не нужно проверочное ограничение, если я правильно понял.Просто обычный обнуляемый столбец с внешним ключом, который ссылается на A.ID.Таким образом, все допустимые значения - это значения в A.ID и NULL.

Обновленный ответ после обновления вопроса: если вы не можете вставить значение 0 в A.ID, вы не можете использовать чужойключ.Но, как уже говорили другие, это не рекомендуемая практика - лучше вставить значение 0 в A.ID и создать внешний ключ или использовать NULL вместо 0 в таблице B.

0 голосов
/ 15 апреля 2011

Просто сделайте ограничение FOREIGN KEY.B.ID все еще может быть NULL.

Вы найдете несколько примеров на psoug

Я бы не рекомендовал хранить 0 вместо NULL.0 не имеет семантики в реляционных данных, и ручное ограничение CHECK будет сложнее поддерживать и, вероятно, намного менее эффективно, поскольку оптимизатор на основе затрат Oracle может не использовать его для своих преобразований запросов.Лучше вставить NULL в столбец внешнего ключа и, возможно, прочитать его, используя любое из следующих эквивалентных выражений:

NVL(B.ID, 0)
DECODE(B.ID, NULL, 0, B.ID)
CASE B.ID WHEN NULL THEN 0 ELSE B.ID END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...