"В таблице может быть только один столбец IDENTITY" - Почему?

"В таблице может быть только один столбец IDENTITY"

Почему так? Возьмите сценарий транспортного средства, существует номер шасси, который является уникальным, а также регистрационный номер, который оказывается уникальным. Чтобы отобразить этот сценарий в sql server, нам нужна настраиваемая реализация для столбцов. И наоборот, в Oracle у вас может быть столько последовательностей, сколько вы хотите на таблице. Почему существует ограничение на столбце IDENTITY, какие-либо конкретные причины?

Сценарий наличия схемы транспортного средства является чем-то мнимым, и я спрашиваю себя, почему существует ограничение на столбец идентичности.

Ответ 1

Столбец Identity в SQL Server имеет семя и автоинкремент. Мы всегда могли рассчитать, что должно быть 2-м гипотетическим значением id, если бы мы знали значение первого столбца id.

например. Если это был юридический синтаксис

create table #foo
(
bar int identity(1,10),
baz int identity(1000,1)
)

Нам не нужно будет хранить базу, поскольку она может быть рассчитана из строки следующим образом.

baz = 1000 + (bar-1)/10

Ответ 2

Потому что это будет одно и то же значение. если у вас есть идентификатор (1,1) в качестве основного и личность (100,2), вы получите следующие результаты:

1     100
2     102
3     104
4     106
5     108
6     110
7     112
8     114
9     116
10    118

вы можете получить второй столбец, выполнив следующее:

((ID-1) * 2) + 100

это линейное уравнение, так что будет точкой, отличной от показа?

Ответ 3

Данные хранятся в базе данных с помощью столбца IDENTITY. Один такой столбец позволяет хранить файловую систему. Наличие нескольких столбцов IDENTITY путало бы проблему.

Моя рекомендация - выбрать один из ваших столбцов как IDENTITY или PRIMARY KEY, а для другого - UNIQUE KEY. Как пользователь не будет никакой разницы, но это сделает СУБД счастливым.

Ответ 4

  • Последовательности Oracle не являются столбцами IDENTITY SQL Server: вы пишете для них некоторый код. Они не работают из коробки на основе CREATE TABLE DDL
  • Любые последующие столбцы IDENTITY могут быть выработаны из первого (отредактируйте: как другие люди упомянутые)

Ответ 5

Причина в MSDN не объясняется, что я могу найти. Однако я подозреваю, что это связано с тем, как сервер sql реализует столбец идентификаторов. Концептуально я считаю, что это больше параметр или значение на уровне таблицы, чем на уровне столбца, а столбец - это просто способ получить доступ к значению. Я думаю, это потому, что все методы взаимодействия со значениями идентичности имеют таблицу как параметр, а не столбец, например. IDENT_SEED, IDENT_CURRENT и IDENT_INCR. Если это был параметр уровня столбца, параметры будут содержать имя столбца. Если в таблице было несколько столбцов, эти функции не помогли бы.

Я просто размышляю.

Ответ 6

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