2014-01-15 3 views
-1

Это не работает:Как переделать таблицу в 0 на SQL Server?

DBCC CHECKIDENT('[DMS].[dbo].[ImportedFiles]', RESEED, 0) 

После следующей записи Вставляется, я хочу Семя быть 0 не 1.

Я попытался это, но функция не нравится:

DBCC CHECKIDENT('[DMS].[dbo].[ImportedFiles]', RESEED, -1) 

DBCC CHECKIDENT('[DMS].[dbo].[ImportedFiles]', RESEED, '-1') 

Как сбросить семя таблицы так, чтобы следующая запись, которая идет, является ZERO? (0)?

+2

@ebyrob почему должно 0 быть недействительным? Что делать, если я начинаю с -10, если SQL Server пропускает 0, когда он туда доберется? –

+0

Вообще говоря, 0-я запись обычно является специальной, которая указывает на не значение. В тех случаях, когда я хочу иметь 0-ю запись для этой цели, я вручную вставляю ее, вставляя идентификационные вставки, а затем снова отключаю ее. – David

+0

@ebyrob, пожалуйста, найдите мне документацию для любой базы данных, которая считает, что 0 является недопустимым значением в любом контексте, неважно, что будет пропускать 0 только потому, что. –

ответ

6

Если столбец IDENTITY определяется как (0,1), а также таблица пуста, и нет никаких внешних ключей, участвующих, только вопрос:

TRUNCATE TABLE dbo.ImportedFiles; 

Если таблица имеет внешние ключи - или любое событие, по этому вопросу - вы можете просто переопределить значение:

SET IDENTITY_INSERT dbo.ImportedFiles ON; 
INSERT dbo.ImportedFiles(col1, col2) SELECT 0, 'UNKNOWN'; 
SET IDENTITY_INSERT dbo.ImportedFiles OFF; 

Я подтвердил, что @Avarkx's answer работает - переустановка с -1 должен дать следующую вставку 0. Таким образом, я не уверен, какую версию вам 're использование там, где это не работает (я понятия не имею, как интерпретировать «не нравится») ,

5

Я не могу воспроизвести это ... Вот тест, который работает, Sql Server 2012R2. 2008 R2.

Кроме того, @ Любой человек, говорящий 0, означает что-то, на самом деле это не так. Хотя довольно распространено видеть, что 0 значений используются как неизвестные и т. Д., Бизнес-логика, построенная вокруг столбца IDENTITY, представляет собой анти-шаблон, которого обычно следует избегать и, безусловно, никогда не рекомендуется.

CREATE TABLE dbo.Foo 
(
    Foo_PK  BIGINT IDENTITY(1, 1) NOT NULL, 
    Bar   BIT 
); 

INSERT INTO dbo.Foo (Bar) 
SELECT b.Bar 
FROM (  SELECT Bar = NULL 
UNION ALL SELECT Bar = 1 
UNION ALL SELECT Bar = 0) b; 

SELECT * 
FROM dbo.Foo; 

DBCC CHECKIDENT ('dbo.Foo', RESEED, -1); 

INSERT INTO dbo.Foo (Bar) 
SELECT b.Bar 
FROM (  SELECT Bar = NULL 
UNION ALL SELECT Bar = 1 
UNION ALL SELECT Bar = 0) b; 

SELECT * 
FROM dbo.Foo; 

GO 
DROP TABLE dbo.Foo; 
+0

", в то время как обычно считается, что 0 значений используются как неизвестные и т. Д., Бизнес-логика, построенная вокруг столбца IDENTITY, является анти-шаблоном." Эта. Я пытаюсь разбить крупного клиента этой привычки (как программное обеспечение, так и люди БД обычно предполагают, что идентификатор 0 недействителен без какого-либо тестирования или анализа). Это так сложно и сложно, когда возникают связанные ошибки, и ответ «Они просто не должны использовать 0 в качестве идентификатора». –

+0

@ebyrob Что? Я ничего не говорил об этом в любом случае, все, что я делал, было замечанием о том, насколько я могу относиться к комментариям Avarkx о том, как автоматически обрабатывать идентификаторы с нулевым значением как особые случаи. В мире SQL Server/.Net это неприятный и, к сожалению, общий (или, может быть, просто лучший клиент?) Анти-шаблон. –

+0

@ebyrob Я ожидал бы, что таких полных перестроек будет сложнее, если вы полагаетесь на 'WHERE a.FK = 1' вместо того, чтобы просто делать правильные объединения и' WHERE a.Code = 'UNKNOWN'' эквивалент ... – Avarkx

Смежные вопросы