Mam bazę danych MS SQL 2005 z tabelą Test
z kolumną ID
. ID
to kolumna tożsamości.
Mam wiersze w tej tabeli i wszystkie mają odpowiadające im wartości automatycznie zwiększane o identyfikator.
Teraz chciałbym zmienić każdy identyfikator w tej tabeli w następujący sposób:
ID = ID + 1
Ale kiedy to robię, pojawia się błąd:
Nie można zaktualizować kolumny tożsamości „ID”.
Próbowałem tego:
ALTER TABLE Test NOCHECK CONSTRAINT ALL
set identity_insert ID ON
Ale to nie rozwiązuje problemu.
Muszę ustawić tożsamość w tej kolumnie, ale od czasu do czasu muszę też zmieniać wartości. Więc moje pytanie brzmi, jak wykonać to zadanie.
sql-server
sql-server-2005
tsql
identity
sql-server-2005-express
Tomasz Smykowski
źródło
źródło
#temp
stół, który następnie upuszczasz, jest kolejnym krokiem, którego tutaj nie policzyłeś.IDENTITY
wartości kolumn są niezmienne.Istnieje jednak możliwość przełączenia metadanych tabeli w celu usunięcia
IDENTITY
właściwości, wykonania aktualizacji, a następnie przełączenia z powrotem.Zakładając następującą strukturę
Wtedy możesz to zrobić
W SQL Server 2012 można mieć kolumnę automatycznie zwiększającą się, którą można również łatwiej aktualizować za pomocą
SEQUENCES
źródło
Za pomocą interfejsu użytkownika w menedżerze SQL Server 2005 zmień kolumnę, usuń właściwość autonumer (tożsamość) kolumny (wybierz tabelę, klikając ją prawym przyciskiem myszy i wybierz opcję „Projekt”).
Następnie uruchom zapytanie:
Następnie przejdź i dodaj właściwość autonumber z powrotem do kolumny.
źródło
Id
wartości Auto Identity przesunięte o 1.Po pierwsze, włączenie lub wyłączenie IDENTITY_INSERT w tym przypadku nie będzie działać dla tego, czego potrzebujesz (jest używane do wstawiania nowych wartości, takich jak podłączanie luk).
Wykonywanie operacji za pośrednictwem graficznego interfejsu użytkownika po prostu tworzy tabelę tymczasową, kopiuje wszystkie dane do nowej tabeli bez pola tożsamości i zmienia nazwę tabeli.
źródło
Można to zrobić za pomocą tabeli tymczasowej.
Pomysł
Zapytania SQL
Powiedzmy, że twoja
test
tabela ma dwie dodatkowe kolumny (column2
icolumn3
) oraz że istnieją 2 tabele z odwołaniami do kluczy obcych otest
nazwieforeign_table1
iforeign_table2
(ponieważ rzeczywiste problemy nigdy nie są proste).Otóż to.
źródło
DBCC CHECKIDENT ('databasename.dbo.orders', RESEED, 999) możesz zmienić dowolny numer kolumny tożsamości za pomocą tego polecenia, a także możesz rozpocząć ten numer pola od każdego numeru, na przykład w moim poleceniu proszę zacząć od 1000 (999 + 1) mam nadzieję, że wystarczy ... powodzenia
źródło
Jeśli kolumna nie jest PK, zawsze możesz utworzyć Nową kolumnę w tabeli z rosnącymi liczbami, usunąć oryginał, a następnie zmienić nową, tak aby była stara.
ciekawy, dlaczego możesz to zrobić ... większość, z którymi kiedykolwiek miałem do czynienia z kolumnami tożsamości, polegała na uzupełnianiu liczb, a skończyło się na użyciu DBCC CHECKIDENT (nazwa tabeli, RESEED, newnextnumber)
powodzenia!
źródło
Modyfikacja tożsamości może się nie powieść w zależności od wielu czynników, głównie związanych z obiektami / relacjami powiązanymi z kolumną id. Wygląda na to, że projekt db jest tutaj tak samo ważny, jak identyfikatory powinny rzadko, jeśli w ogóle, zmieniać (jestem pewien, że masz swoje powody i kaskadowo wprowadzasz zmiany). Jeśli naprawdę potrzebujesz od czasu do czasu zmieniać identyfikatory, sugerowałbym utworzenie nowej fikcyjnej kolumny identyfikatora, która nie jest kluczem podstawowym / automatycznym numerem, którym możesz samodzielnie zarządzać i generować na podstawie bieżących wartości. Alternatywnie, powyższy pomysł Chrisotphersa byłby moją inną sugestią, jeśli masz problemy z zezwoleniem na wstawianie tożsamości.
Powodzenia
PS to nie zawodzi, ponieważ kolejność, w której działa, próbuje zaktualizować wartość na liście do pozycji, która już istnieje na liście identyfikatorów? ściskając słomki, być może dodaj liczbę rzędów + 1, a jeśli to zadziała, odejmij liczbę rzędów: -S
źródło
Jeśli musisz od czasu do czasu zmieniać identyfikatory, prawdopodobnie najlepiej nie używać kolumny tożsamości. W przeszłości zaimplementowaliśmy ręcznie automatyczne numerowanie pól przy użyciu tabeli „Liczniki”, która śledzi następny identyfikator każdej tabeli. IIRC zrobiliśmy to, ponieważ kolumny tożsamości powodowały uszkodzenie bazy danych w SQL2000, ale możliwość zmiany identyfikatorów była czasami przydatna do testowania.
źródło
Możesz wstawiać nowe wiersze ze zmodyfikowanymi wartościami, a następnie usuwać stare wiersze. Poniższy przykład zmień identyfikator na taki sam jak klucz obcy PersonId
źródło
Najpierw zapisz wszystkie identyfikatory i zmień je programowo na wartości, których chcesz, następnie usuń je z bazy danych, a następnie wstaw ponownie, używając czegoś podobnego:
Do wkładek zbiorczych:
Przykładowe dane z pliku.csv:
Jeśli nie
identity_insert
wyłączysz, pojawi się następujący błąd:źródło
Widziałem dobry artykuł, który pomógł mi w ostatniej chwili. Próbowałem wstawić kilka wierszy w tabeli, która miała kolumnę tożsamości, ale zrobiłem to źle i musiałem usunąć z powrotem. Po usunięciu wierszy zmieniła się moja kolumna tożsamości. Próbowałem znaleźć sposób na zaktualizowanie wstawionej kolumny, ale - bez powodzenia. Tak więc podczas wyszukiwania w Google znalazłem link ...
http://beyondrelational.com/modules/2/blogs/28/posts/10337/sql-server-how-do-i-insert-an-explicit-value-into-an-identity-column-how-do- i-update-the-value-of-an.aspx
źródło
Bardzo ładne pytanie, najpierw musimy na IDENTITY_INSERT dla konkretnej tabeli, a następnie uruchomić zapytanie wstawiające (należy określić nazwę kolumny).
Uwaga: po edycji kolumny tożsamości nie zapomnij wyłączyć IDENTITY_INSERT. Jeśli tego nie zrobiłeś, nie możesz edytować kolumny tożsamości dla żadnej innej tabeli.
http://allinworld99.blogspot.com/2016/07/how-to-edit-identity-field-in-sql.html
źródło