столбец идентичности на сервере Sql - PullRequest
6 голосов
/ 20 мая 2009

Почему сервер Sql не допускает более одного столбца IDENTITY в таблице ?? Любые конкретные причины.

Ответы [ 8 ]

7 голосов
/ 20 мая 2009

Зачем вам это нужно? SQL Server отслеживает одно значение (текущее значение идентификатора) для каждой таблицы со столбцом IDENTITY, поэтому он может иметь только один столбец идентификаторов на таблицу.

2 голосов
/ 21 мая 2009

Поскольку MS поняла, что лучше, чем 80% пользователей хотели бы иметь только один столбец автоинкремента на таблицу, и обходной путь, чтобы иметь секунду (или более), достаточно прост, то есть создайте IDENTITY с seed = 1, increment = 1, затем вычисленный столбец, умножающий автоматически сгенерированное значение на коэффициент для изменения приращения, и добавление смещения для изменения начального числа.

2 голосов
/ 20 мая 2009

Столбец Identity - это столбец (также известный как поле) в таблице базы данных, который: -

  1. Уникально идентифицирует каждую строку в таблице
  2. Состоит из значений, сгенерированных базой данных

Это очень похоже на поле AutoNumber в Microsoft Access или последовательность в Oracle.

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

Сервер SQL использует столбец идентификатора в качестве значения ключа для ссылки на конкретную строку. Таким образом, может быть создан только один столбец идентификаторов. Также, если никакие столбцы идентификаторов явно не указаны, сервер Sql хранит отдельный столбец, который содержит значение ключа для каждой строки. Как уже говорилось, если вы хотите, чтобы несколько столбцов имели уникальное значение, вы можете использовать ключевое слово UNIQUE.

2 голосов
/ 20 мая 2009

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

1 голос
/ 22 февраля 2011

Да, последовательности допускают более одного идентификатора, например столбцы в atable, но здесь есть некоторые проблемы. В типичном сценарии разработки я видел, как разработчики вручную вставляли допустимые значения в столбец (который предполагается вставить через последовательность). Позже, когда последовательность попытается вставить значение в таблицу, она может потерпеть неудачу из-за нарушения уникального ключа.

Кроме того, в сценарии с несколькими разработчиками / несколькими поставщиками разработчики могут использовать одну и ту же последовательность для нескольких таблиц (поскольку последовательности не связаны с таблицами). Это может привести к отсутствию значений в одной из таблиц. то есть tableA может получить значение 1, в то время как tableB может использовать значение 2, а tableA получит 3. Это означает, что tableA будет иметь 1 и 3 (отсутствует 2).

Помимо этого, есть еще один сценарий, когда у вас есть таблица, которая усекается каждый день. Поскольку последовательности не имеют какой-либо связи с таблицей, усеченная таблица продолжит использовать Seq.NextVal снова (если вы вручную не сбросите последовательность), что приведет к пропущенным значениям или даже к более опасной ошибке переполнения артметики через некоторое время.

В силу вышеприведенной причины я считаю, что последовательности Oracle и столбец идентификаторов SQL-сервера хороши для своих целей. Я бы предпочел, чтобы oracle реализовал концепцию столбца Identity, а SQL Server - концепцию последовательности, чтобы разработчики могли реализовать любое из двух в соответствии со своими требованиями.

0 голосов
/ 21 мая 2009

Я всегда рассматривал это как произвольное и плохое ограничение для SQL Server. Да, вы хотите, чтобы только один столбец идентификаторов фактически идентифицировал строку, но есть веские причины, по которым вы хотите, чтобы база данных автоматически генерировала число для нескольких полей в базе данных.

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

Плохая вещь в последовательностях заключается в том, что вам приходится писать код, который фактически увеличивает их, будь то в операторе вставки или в триггере вставки в таблице. Приятной особенностью удостоверения SQL Server является то, что все, что вам нужно сделать, - это изменить свойство или добавить ключевое слово для создания таблицы, и все готово.

0 голосов
/ 20 мая 2009

Идентификационный столбец используется для уникальной идентификации одной строки таблицы. Если вы хотите, чтобы другие столбцы были уникальными, вы можете создать УНИКАЛЬНЫЙ индекс для каждого столбца «идентификатор», который вам может понадобиться.

0 голосов
/ 20 мая 2009

Цель столбца идентификаторов состоит в том, что он будет содержать уникальное значение для каждой строки в таблице. Так зачем вам нужно более одного из них в любой таблице?

Возможно, вам нужно уточнить свой вопрос, если у вас есть реальная потребность в более чем одном.

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