Столбец идентификаторов на сервере Sql

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

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

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

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

Ответ 7

Столбец идентификатора используется для однозначной идентификации одной строки таблицы. Если вы хотите, чтобы другие столбцы были уникальными, вы можете создать индекс UNIQUE для каждого столбца "identity", который вам может понадобиться.

Ответ 8

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

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

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