2010-09-27 1 views
5

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

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

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

+1

Действительно ли это имеет значение? –

+0

Я хочу знать, почему это невозможно. – Chaitanya

+2

Потому что инженеры из команды SQL Server либо не могли этого сделать, либо не думали, что это хорошая идея. –

ответ

8

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

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

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

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

baz = 1000 + (bar-1)/10 
+1

черт тебя за то, что я пытался сказать! – DForck42

2

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

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

5

Потому что это будет то же самое значение. если вы имели идентичность (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

Это линейное уравнение, так что же было бы отличным от шоу?

+0

Мои мысли точно. – ErikE

+0

Значения IDENTITY не всегда назначаются последовательно. Если у вас есть две одновременные вставки из нескольких строк, тогда значения могут чередоваться между двумя наборами строк. Кроме того, могут быть вставлены конкретные значения, чтобы два столбца не зависели друг от друга. Всего несколько причин, по которым вам могут понадобиться две колонки IDENTITY. – sqlvogel

+1

@dportas, конечно, но теоретически, если бы у вас было 2 идентичности, они оба были бы назначены одновременно, все равно давая вам тот же эффект. – DForck42

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

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

1

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

Я только что размышляю.