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?
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.
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
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
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
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)
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.
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.
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)
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.
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.
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;
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