Usunąłem niektóre rekordy z tabeli w bazie danych SQL Server. Teraz ID zmienia się z 101 na 1200. Chcę ponownie usunąć rekordy, ale chcę, aby ID powróciły do 102. Czy istnieje sposób, aby to zrobić w SQL Server?
Usunąłem niektóre rekordy z tabeli w bazie danych SQL Server. Teraz ID zmienia się z 101 na 1200. Chcę ponownie usunąć rekordy, ale chcę, aby ID powróciły do 102. Czy istnieje sposób, aby to zrobić w SQL Server?
Odpowiedzi:
Wydaj następujące polecenie, aby ponownie załadować program mytable, aby rozpocząć od 1:
DBCC CHECKIDENT (mytable, RESEED, 0)
Przeczytaj o tym w Books on Line (BOL, pomoc SQL). Uważaj również, aby nie mieć rekordów wyższych niż ustawione ziarno.
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT('databasename.dbo.tablename', RESEED, number)
jeśli liczba = 0, to w kolejnym wstawieniu pole automatycznego przyrostu będzie zawierało wartość 1
jeśli liczba = 101, to w kolejnym wstawieniu pole automatycznego przyrostu będzie zawierało wartość 102
Kilka dodatkowych informacji ... Może ci się przydać
Przed udzieleniem automatycznego przyrostu number
w powyższym zapytaniu musisz upewnić się, że kolumna automatycznego przyrostu w istniejącej tabeli zawiera wartości mniejsze niż number
.
Aby uzyskać maksymalną wartość kolumny (nazwa_kolumny) z tabeli (tabela1), można użyć następującego zapytania
SELECT MAX(column_name) FROM table1
pół-idiotoodporny:
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
Jeśli używasz MySQL, spróbuj tego:
ALTER TABLE tablename AUTO_INCREMENT = 1
Usuń i ponownie posadź 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.
Na podstawie zaakceptowanej odpowiedzi dla osób, które spotkały się z podobnym problemem, z pełną kwalifikacją schematu:
( [MyDataBase].[MySchemaName].[MyTable]
) ... powoduje błąd, musisz znajdować się w kontekście tej bazy danych
Oznacza to, że następujący błąd zgłosi błąd:
DBCC CHECKIDENT ([MyDataBase].[MySchemaName].[MyTable], RESEED, 0)
Zamiast tego dołącz pełną nazwę tabeli do pojedynczych cudzysłowów:
DBCC CHECKIDENT ('[MyDataBase].[MySchemaName].[MyTable]', RESEED, 0)
Kilka odpowiedzi zaleca użycie takiego stwierdzenia:
DBCC CHECKIDENT (mytable, RESEED, 0)
Ale OP powiedział „usunął niektóre rekordy”, które mogą nie być wszystkie, więc wartość 0 nie zawsze jest właściwa. Inna odpowiedź sugeruje automatyczne znalezienie maksymalnej wartości prądu i ponowne wysunięcie do tej wartości, ale napotyka to problemy, jeśli nie ma żadnych rekordów w tabeli, a zatem max () zwróci NULL. Komentarz sugeruje użycie po prostu
DBCC CHECKIDENT (mytable)
zresetować wartość, ale inny komentarz poprawnie stwierdził, że zwiększa to wartość do maksimum już w tabeli; nie zmniejszy to wartości, jeśli jest już wyższa niż maksimum w tabeli, co chciał zrobić PO.
Lepsze rozwiązanie łączy te pomysły. Pierwszy CHECKIDENT resetuje wartość do 0, a drugi resetuje ją do najwyższej wartości aktualnie w tabeli, w przypadku gdy w tabeli znajdują się rekordy:
DBCC CHECKIDENT (mytable, RESEED, 0)
DBCC CHECKIDENT (mytable)
Jak wskazało wiele komentarzy, upewnij się, że w innych tabelach nie ma kluczy obcych wskazujących na usunięte rekordy. W przeciwnym razie te klucze obce wskażą rekordy utworzone po ponownym posadzeniu tabeli, co prawie na pewno nie jest tym, co miałeś na myśli.
Chcę dodać tę odpowiedź, ponieważ DBCC CHECKIDENT
-podejście spowoduje problemy podczas używania schematów dla 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óre powinny wypisać się 0
w powyższym przykładzie.
Ogólnie nie chcesz tego robić. Reseed może powodować problemy z integralnością danych. Jest tak naprawdę do użytku tylko w systemach programistycznych, w których usuwasz wszystkie dane testowe i zaczynasz od nowa. Nie należy go używać w systemie produkcyjnym, jeśli wszystkie powiązane rekordy nie zostały usunięte (nie każda tabela, która powinna być w relacji klucza obcego, jest!). Możesz stworzyć bałagan, robiąc to, a zwłaszcza jeśli chcesz to robić regularnie po każdym usunięciu. Nie warto martwić się lukami w wartościach pola tożsamości.
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 na zmianę automatycznego przyrostu na 0 lub dowolną żądaną liczbę. Zrozumiałem to, eksportując bazę danych i sam czytając kod.
Możesz również napisać to w ten sposób, aby uczynić z niego rozwiązanie jednowierszowe:
ALTER TABLE `table_name` MODIFY `id` int(12) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=0;