Необходимо ли определять для FOREIGN KEY те же ограничения, которые определены для PRIMARY KEY (родительская таблица)? - PullRequest
0 голосов
/ 16 апреля 2019

Допустим, я создаю таблицу Clients. Я определяю первичный ключ и набор ограничений, таких как:

  • НЕ NULL
  • Длина> 5
  • Верхний регистр

и т. Д.

Теперь я создаю другую таблицу с внешним ключом для Clients первичного ключа. Должен ли я создать такие же ограничения для внешнего ключа?

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

Пример: я не создаю ограничения для внешнего ключа, и я пытаюсь добавить значение, длина которого меньше 5 символов и строчные буквы ... База данных не найдет это значение в родительской таблице, следовательно, значение не будет записано, так какой смысл устанавливать такой же набор ограничений для внешней таблицы?

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

Вам не нужны ограничения длины или верхнего регистра для внешнего ключа. Они будут «неявно проверены» ограничением внешнего ключа (как вы говорите, потому что ссылочные данные не могут существовать).

Но для обнуляемости это выбор. В SQL Server, если один или несколько столбцов в ссылочной таблице внешнего ключа равны NULL, ограничение не применяется.

Таким образом, здесь вместо этого должен быть вопрос - есть ли в другой таблице строки, которые действительно должны не ссылаться на строку в таблице Clients?


Другие посоветовали, чтобы ПК генерировался системой. Хотя я согласен с тем, что это часто полезно, не забывайте также применять ограничения для реальных данных. Например. даже если этот столбец не является вашим ПК, возможно, ему нужно уникальное ограничение, чтобы избежать дубликатов в ваших данных.

0 голосов
/ 16 апреля 2019

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

Опять же, как упоминал @Dale Burrell, PRIMARY KEY должен генерироваться системой для обеспечения уникальности. Если вы собираетесь создать кластерный индекс для столбца первичного ключа, он должен быть узким, увеличивающимся, а не нулевым, уникальным значением для получения хорошей производительности.

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