Ключи в SQL Server являются глобальными - почему? - PullRequest
1 голос
/ 03 марта 2009

Индексы и ограничения в MS SQL Server являются локальными для таблицы, в которой они определены. Таким образом, вы можете без проблем создать один и тот же индекс или имя ограничения в нескольких таблицах.

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

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

ТИА

1 Ответ

3 голосов
/ 03 марта 2009

Согласно «SQL-99 Complete, Really» Питера Гулутзана и Труди Пельцер, имена ограничений определяются по схеме , в которой они живут, и таблица, на которую влияет ограничение, должна находиться в одной и той же таблице. схемы. Но имя ограничения не определяется этим именем таблицы. Имя ограничения должно быть уникальным в пределах схемы, в которой оно находится.

  • ДА: myschema.some_primary_key
  • NO: myschema.mytable.some_primary_key

Что касается "почему", то это так, я предполагаю, что это связано с неким ограничением в SQL-99, которое называется ASSERTION. Утверждение не «принадлежит» одной таблице, как верно для первичного ключа, внешнего ключа и проверочных ограничений. Утверждение объявляет условие, которое должно быть истинным для успешного выполнения любого INSERT/UPDATE/DELETE, и утверждение может ссылаться на несколько таблиц. Не имеет смысла квалифицировать эти имена ограничений по какой-либо таблице.

Я не знаю, сколько брендов СУБД реализуют утверждения SQL (на самом деле я не знаю ни одного), но они могли бы также соответствовать стандартным правилам SQL для имен ограничений, поэтому в будущем они могут выбрать реализовать функцию утверждения в соответствии со стандартом.

...