Как увеличить (или зарезервировать) значение IDENTITY в SQL Server без вставки в таблицу - PullRequest
5 голосов
/ 26 января 2009

Есть ли способ зарезервировать, пропустить или увеличить значение столбца идентификаторов?

У меня есть две таблицы, объединенные в один-к-одному. Первый из них имеет столбец IDENTITY PK, а второй - int PK (не IDENTITY). Я использовал для вставки в первый, получить идентификатор и вставить во второй. И все работает нормально.

Теперь мне нужно вставить значения во вторую таблицу, не вставляя в первую.

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

РЕДАКТИРОВАТЬ: Больше информации

Это работает:

-- I need new seed number, but not table row 
-- so i will insert foo row, get id, and delete it
INSERT INTO TABLE1 (SomeRequiredField) VALUES ('foo'); 
SET @NewID = SCOPE_IDENTITY(); 
DELETE FROM TABLE1 WHERE ID=@NewID;

-- Then I can insert in TABLE2  
INSERT INTO (ID, Field, Field) VALUES (@NewID, 'Value', 'Value'); 

Еще раз - это работает.

Вопрос в том, можно ли получить идентификатор, не вставляя в таблицу?

DBCC необходимы права владельца; есть ли чистый вызываемый пользователем SQL для этого?

Ответы [ 7 ]

6 голосов
/ 26 января 2009

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

Есть способы обойти это, чтобы сделать то, что вы ищете, но обычно это происходит в распределенной среде, а не из-за того, что кажется изменением модели данных.

4 голосов
/ 26 января 2009

Тогда это уже не отношения один-к-одному.

Просто нарушите ограничение PK.

3 голосов
/ 26 января 2009

В этой статье из электронной документации по SQL Server обсуждается использование метода DBCC CHECKIDENT для обновления начального числа таблицы.

Из этой статьи:

В этом примере текущее значение идентификатора в таблице заданий устанавливается на значение 30.

USE pubs
GO
DBCC CHECKIDENT (jobs, RESEED, 30)
GO
3 голосов
/ 26 января 2009

Используйте оператор DBCC CHECKIDENT.

0 голосов
/ 26 января 2009

это может помочь

SET IDENTITY_INSERT [имя_базы_данных. [имя_схемы]. ] таблица {ВКЛ | OFF}

http://msdn.microsoft.com/en-us/library/aa259221(SQL.80).aspx

Позволяет вставлять явные значения в столбец идентификации таблицы.

0 голосов
/ 26 января 2009

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

0 голосов
/ 26 января 2009

Я бы посмотрел на функцию OUTPUT INTO, если вы используете SQL Server 2005 или выше. Это позволит вам вставить в основную таблицу и использовать идентификаторы, назначенные в то время, для создания строк во вторичной таблице.

Я предполагаю, что введено ограничение внешнего ключа - потому что это будет единственной причиной, по которой вам нужно сделать это в первую очередь.

...