Nie można zaktualizować kolumny tożsamości.
SQL Server nie pozwala na aktualizację kolumny tożsamości w przeciwieństwie do tego, co można zrobić z innymi kolumnami za pomocą instrukcji aktualizacji.
Chociaż istnieją pewne alternatywy, aby osiągnąć podobny rodzaj wymagań.
- Kiedy wartość kolumny Tożsamość wymaga aktualizacji dla nowych rekordów
Użyj DBCC CHECKIDENT, który sprawdza bieżącą wartość tożsamości dla tabeli i jeśli to konieczne, zmienia wartość tożsamości.
DBCC CHECKIDENT('tableName', RESEED, NEW_RESEED_VALUE)
- Kiedy wartość kolumny Tożsamość wymaga aktualizacji dla istniejących rekordów
Użyj IDENTITY_INSERT, który pozwala wstawić wartości jawne do kolumny tożsamości tabeli.
SET IDENTITY_INSERT YourTable {ON|OFF}
Przykład:
-- Set Identity insert on so that value can be inserted into this column
SET IDENTITY_INSERT YourTable ON
GO
-- Insert the record which you want to update with new value in the identity column
INSERT INTO YourTable(IdentityCol, otherCol) VALUES(13,'myValue')
GO
-- Delete the old row of which you have inserted a copy (above) (make sure about FK's)
DELETE FROM YourTable WHERE ID=3
GO
--Now set the idenetity_insert OFF to back to the previous track
SET IDENTITY_INSERT YourTable OFF
UPDATE YourTable SET IdentityCol = 13
.).SET IDENTITY_INSERT YourTable ON
zezwala tylko na WSTAWKI, a nie na AKTUALIZACJE.Jeśli masz właściwe pytanie, chcesz zrobić coś takiego
Pozwól, że powiem ci, że nie jest to łatwy proces i nie jest zalecane korzystanie z niego, ponieważ mogą być
foreign key
z nim związane.Ale oto kroki, aby to zrobić, weź
back-up
stolikKrok 1- Wybierz widok projektu tabeli
Krok 2 - Wyłącz kolumnę tożsamości
Teraz możesz użyć
update
zapytania.Teraz
redo
krok 1 i krok 2 i Włącz kolumnę tożsamościOdniesienie
źródło
:)
Musisz
Następnie usuń wiersz i włóż go z inną tożsamością.
Po zakończeniu wstawiania nie zapomnij wyłączyć tożsamości
źródło
źródło
Spróbuj użyć
DBCC CHECKIDENT
:źródło
skopiuj tabelę do nowej tabeli bez kolumny tożsamości.
dodaj kolumnę tożsamości do newtable z nowym seedem i ustaw jako klucz podstawowy
źródło
nazwa_tabeli = podaj tabelę, którą chcesz zresetować
wartość = wartość początkowa równa zero, aby rozpocząć kolumnę tożsamości od 1
źródło
Korzystając z Identity_Insert, nie zapomnij podać nazw kolumn, ponieważ sql nie pozwoli na wstawienie bez ich podania
źródło
Możesz także użyć
SET IDENTITY INSERT
, aby wstawić wartości do kolumny tożsamości.Przykład:
Następnie możesz wstawić do kolumny tożsamości potrzebne wartości.
źródło
Jednak powyższy kod działa tylko wtedy, gdy nie ma relacji klucz-klucz obcy
źródło
Kompletne rozwiązanie dla programistów C # za pomocą konstruktora poleceń
Przede wszystkim musisz znać te fakty:
Więc kiedy już to wiesz, musisz to zrobić. Albo zaprogramuj własną instrukcję SQL Insert, albo program, który posiadasz konstruktora poleceń insert. Lub użyj tego, który jestem zaprogramowany dla ciebie. Biorąc pod uwagę DataTable, generuje skrypt SQL Insert:
źródło
Rozwiązałem ten problem, najpierw używając DBCC, a następnie wstawiania. Na przykład, jeśli twój stół to
Najpierw ustaw nową bieżącą wartość identyfikatora w tabeli jako NEW_RESEED_VALUE
MyTable {IDCol, colA, colB}
wtedy możesz użyć
Spowodowałoby to zduplikowanie wszystkich rekordów, ale przy użyciu nowej wartości IDCol zaczynającej się od NEW_RESEED_VALUE. Następnie można usunąć zduplikowane wiersze o wyższej wartości identyfikatora po usunięciu / przeniesieniu odniesień do klucza obcego, jeśli takie istnieją.
źródło
Możesz utworzyć nową tabelę za pomocą następującego kodu.
Następnie usuń starą bazę danych i zmień nazwę nowej bazy danych na nazwę starej bazy danych. Uwaga : kolumny 1 i 2 reprezentują wszystkie kolumny w starej tabeli, które chcesz zachować w nowej tabeli.
źródło
Jeśli chcesz zmienić wartość klucza podstawowego na inną liczbę (np. 123 -> 1123). Właściwość tożsamości blokuje zmianę wartości PK. Zestaw Identity_insert nie zadziała. Wykonanie operacji wstawiania / usuwania nie jest zalecane, jeśli masz kaskadowe usuwanie (chyba że wyłączysz sprawdzanie integralności referencyjnej).
Ten skrypt wyłączy tożsamość na PK:
Następnie możesz ustawić relacje, aby zaktualizowały odwołania do klucza obcego. W przeciwnym razie musisz wyłączyć wymuszanie relacji. Ten link SO pokazuje, jak: W jaki sposób ograniczenia klucza obcego można tymczasowo wyłączyć za pomocą T-SQL?
Teraz możesz zrobić swoje aktualizacje. Napisałem krótki skrypt, aby zapisać wszystkie moje aktualizacje SQL na podstawie tej samej nazwy kolumny (w moim przypadku musiałem zwiększyć CaseID o 1 000 000:
Na koniec włącz ponownie integralność referencyjną, a następnie ponownie włącz kolumnę Tożsamość na kluczu podstawowym.
Uwaga: Widzę, że niektórzy ludzie na te pytania pytają DLACZEGO. W moim przypadku muszę scalić dane z drugiej instancji produkcyjnej do głównej bazy danych, aby móc zamknąć drugą instancję. Potrzebuję tylko wszystkich danych PK / FK operacji, aby się nie kolidować. Metadane FK są identyczne.
źródło