Reset AutoIncrement w SQL Server po usunięciu

Usunąłem kilka rekordów z tabeli w bazie danych serwera SQL. Teraz ID jest od 101 do 1200. Chcę jeszcze raz usunąć akta, ale chcę, żeby dokumenty wróciły do 102. Czy istnieje sposób, aby to zrobić w SQL Server?

Author: marc_s, 2009-02-04

11 answers

Wykonaj następujące polecenie, aby ponownie uruchomić mytable, aby rozpocząć od 1:

DBCC CHECKIDENT (mytable, RESEED, 0)

Przeczytaj o tym w książkach on Line (BOL, SQL help). Należy również uważać, aby nie mieć rekordów wyższych niż seed, który ustawiasz.

 484
Author: Robert Wagner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-24 00:34:07
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)

If number=0 then in the next insert the auto increment pole will contain value 1

If number=101 then in the next insert the auto increment pole will contain value 102


Kilka dodatkowych informacji... Może Ci się przydać

przed podaniem auto increment number w powyższym zapytaniu, musisz upewnić się, że kolumna Auto increment w istniejącej tabeli zawiera wartości mniejsze niż number.

Aby uzyskać maksymalną wartość kolumny(column_name) z tabeli (table1) możesz użyć następującego zapytania

 SELECT MAX(column_name) FROM table1
 87
Author: Fathah Rehman P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-02 06:21:01

Semi idiot-proof:

declare @max int;  
select @max = max(key) from table;  
dbcc checkident(table,reseed,@max)

Http://sqlserverplanet.com/tsql/using-dbcc-checkident-to-reseed-a-table-after-delete

 40
Author: user423430,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-01 18:31:28

Jeśli używasz MySQL, spróbuj tego:

ALTER TABLE tablename AUTO_INCREMENT = 1
 17
Author: xaa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-12 18:25:14

Rozgryzłem to. Jest:

 DBCC CHECKIDENT ('tablename', RESEED, newseed)
 8
Author: jumbojs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-18 15:33:07

Usuń i prześlij ponownie wszystkie tabele w bazie danych.

    USE [DatabaseName]
    EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"       -- Disable All the constraints
    EXEC sp_MSForEachTable "DELETE FROM ?"    -- Delete All the Table data
    Exec sp_MSforeachtable 'DBCC CHECKIDENT(''?'', RESEED, 0)' -- Reseed All the table to 0
    Exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"  -- Enable All  the constraints back

-- You may ignore the errors that shows the table without Auto increment field.
 6
Author: BMG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-17 07:59:53

Kilka odpowiedzi zaleca użycie stwierdzenia coś takiego:

DBCC CHECKIDENT (mytable, RESEED, 0)

Ale OP powiedział "usunął niektóre rekordy", które mogą nie być wszystkimi, więc wartość 0 nie zawsze jest odpowiednia. Inna odpowiedź sugerowała automatyczne znalezienie maksymalnej wartości bieżącej i ponowne podanie tej wartości, ale to sprawia kłopoty, jeśli nie ma rekordów w tabeli, a tym samym max() zwróci NULL. Komentarz sugerowany przy użyciu simply

DBCC CHECKIDENT (mytable)

Aby zresetować wartość, ale kolejny komentarz poprawnie stwierdził, że to tylko zwiększa wartość do maksimum już w tabeli; to nie zmniejszy wartość, jeśli jest już wyższa niż maksimum w tabeli, co jest to, co OP chciał zrobić.

Lepsze rozwiązanie łączy te idee. Pierwszy kontroler resetuje wartość do 0, a drugi resetuje ją do najwyższej wartości aktualnie w tabeli, w przypadku, gdy w tabeli są rekordy:
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)

Jak wiele komentarzy wskazuje, upewnij się, że nie ma klucze obce w innych tabelach wskazujące na usunięte rekordy. W przeciwnym razie te klucze obce będą wskazywać rekordy, które utworzysz po ponownym wpisaniu tabeli, co prawie na pewno nie jest tym, o czym miałeś na myśli.

 5
Author: Michael Rodby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-02 20:59:58

Na podstawie zaakceptowanej odpowiedzi, dla tych, którzy napotkali podobny problem, z pełną kwalifikacją schematu:

([MyDataBase].[MySchemaName].[MyTable])... powoduje błąd, musisz być w kontekście tego DB

Oznacza to, że następujący błąd spowoduje:

DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)

Załącz w pełni kwalifikowaną nazwę tabeli pojedynczymi cudzysłowami:

DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
 4
Author: user919426,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-07 12:58:01

Chcę dodać tę odpowiedź, ponieważ podejście DBCC CHECKIDENT - spowoduje problemy podczas używania schematów do tabel. Użyj tego, aby mieć pewność:

DECLARE @Table AS NVARCHAR(500) = 'myschema.mytable';
DBCC CHECKIDENT (@Table, RESEED, 0);

Jeśli chcesz sprawdzić powodzenie operacji, użyj

SELECT IDENT_CURRENT(@Table);

, który powinien wyjść 0 w powyższym przykładzie.

 4
Author: Alexander Schmidt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-21 09:47:44

Nie chcesz tego robić w ogóle. Reseed może powodować problemy z integralnością danych. Jest to naprawdę tylko do użytku w systemach programistycznych, w których usuwasz wszystkie dane testowe i zaczynasz od nowa. Nie powinno być używane w systemie produkcyjnym w przypadku, gdy wszystkie powiązane rekordy nie zostały usunięte (nie każda tabela, która powinna być w relacji z kluczem obcym jest!). Możesz stworzyć bałagan, robiąc to, a zwłaszcza jeśli chcesz to robić regularnie po każdym usunięciu. To zły pomysł martwić się o luki w wartościach pól tożsamości.

 1
Author: HLGEM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-05 19:09:57

A co z tym?

ALTER TABLE `table_name`
  MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;

Jest to szybki i prosty sposób, aby zmienić automatyczny przyrost na 0 lub dowolną liczbę. Domyśliłem się tego eksportując bazę danych i sam czytając kod.

Możesz również napisać to tak, aby było to rozwiązanie jednoliniowe:

ALTER TABLE `table_name` MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;
 0
Author: Victor Resnov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-10 18:44:17