2014-01-04 6 views
2

восстановить базу данных и удаление записей в my_table с помощьюReseed столбец идентичности-не удается - текущее значение идентичности является NULL

delete from my_table; 

Тогда я переустановка столбца идентификации таблицы, используя этот запрос:

DBCC CHECKIDENT('dbo.my_table', reseed, 0); 

и Сообщение, которое я получил:

Проверка идентификационной информации: текущее значение идентификатора «NULL», текущее значение столбца «0».

Но, когда я проверить текущую личность, используя этот запрос:

DBCC CHECKIDENT ('my_table', NORESEED); 

Я получил это сообщение:

Проверка информации о личности: текущее значение идентичности 'NULL', текущее значение столбца ' НОЛЬ'.

Итак, когда я вставляю запись в таблицу, первая вставка дает мне ошибку, но если я попробую еще раз, вставьте ее успешно.

Почему я не могу установить текущее значение столбца идентификатора равным 0? Мне нужно сначала вставить в таблицу, чтобы быть со значением идентичности 1.

+0

ли вы решили это? У меня такая же проблема, но без успеха. – Cirelli94

ответ

2

Вместо использования:

truncate table my_table; 

, который будет автоматически сбросить столбец идентификаторов. (Кроме того, это будет быстрее, чем удаление строки с помощью delete)

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

Ref .: Truncate Table

+0

Проблема в том, что у меня есть FKs в таблице, поэтому таблица обрезания не является хорошим решением. – davor

+0

FK также подвержены удалению. Если, конечно, вы не включили каскад, это очень плохая практика, ИМО. –

+0

К сожалению, я отключил каскад. – davor

0

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

Моего решения - некрасиво, но работает - это явно проверить sys.identity_columns.last_value таблицы, которая говорит вам, была ли или нет таблицы записей вставлена, и вызвать соответствующую DBCC CHECKIDENT команды в каждом конкретном случае:

DECLARE @last_value INT = CONVERT(INT, (SELECT last_value FROM sys.identity_columns WHERE OBJECT_NAME(OBJECT_ID) = 'MyTable')); 
IF @last_value IS NULL 
    BEGIN 
     -- Table newly created and no rows inserted yet; start the IDs off from 1 
     DBCC CHECKIDENT ('MyTable', RESEED, 1); 
    END 
ELSE 
    BEGIN 
     -- Table has rows; ensure the IDs continue from the last ID used 
     DECLARE @lastValUsed INT = (SELECT ISNULL(MAX(ID),0) FROM MyTable); 
     DBCC CHECKIDENT ('MyTable', RESEED, @lastValUsed); 
    END