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?
sql-server
auto-increment
delete-row
jumbojs
źródło
źródło
Odpowiedzi:
Wydaj następujące polecenie, aby ponownie załadować program mytable, aby rozpocząć od 1:
Przeczytaj o tym w Books on Line (BOL, pomoc SQL). Uważaj również, aby nie mieć rekordów wyższych niż ustawione ziarno.
źródło
DBCC CHECKIDENT (mytable, RESEED, 0)
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
źródło
pół-idiotoodporny:
http://sqlserverplanet.com/tsql/using-dbcc-checkident-to-reseed-a-table-after-delete
źródło
Jeśli używasz MySQL, spróbuj tego:
źródło
Usuń i ponownie posadź wszystkie tabele w bazie danych.
źródło
Rozgryzłem to. Jego:
źródło
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 danychOznacza to, że następujący błąd zgłosi błąd:
Zamiast tego dołącz pełną nazwę tabeli do pojedynczych cudzysłowów:
źródło
Kilka odpowiedzi zaleca użycie takiego stwierdzenia:
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
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:
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.
źródło
Chcę dodać tę odpowiedź, ponieważ
DBCC CHECKIDENT
-podejście spowoduje problemy podczas używania schematów dla tabel. Użyj tego, aby mieć pewność:Jeśli chcesz sprawdzić powodzenie operacji, użyj
które powinny wypisać się
0
w powyższym przykładzie.źródło
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.
źródło
A co z tym?
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:
źródło