Ich habe eine MS SQL 2005-Datenbank mit einer Tabelle Test
mit Spalte ID
. ID
ist eine Identitätsspalte.
Ich habe Zeilen in dieser Tabelle und alle haben ihren entsprechenden automatisch inkrementierten ID-Wert.
Jetzt möchte ich jede ID in dieser Tabelle folgendermaßen ändern:
ID = ID + 1
Aber wenn ich das mache, bekomme ich eine Fehlermeldung:
Die Identitätsspalte 'ID' kann nicht aktualisiert werden.
Ich habe das versucht:
ALTER TABLE Test NOCHECK CONSTRAINT ALL
set identity_insert ID ON
Dies löst das Problem jedoch nicht.
Ich muss eine Identität für diese Spalte haben, aber ich muss auch von Zeit zu Zeit Werte ändern. Meine Frage ist also, wie ich diese Aufgabe erfüllen kann.
quelle
#temp
Tabelle, die Sie dann löschen, ein weiterer Schritt ist, haben Sie hier nicht gezählt.IDENTITY
Spaltenwerte sind unveränderlich.Es ist jedoch möglich, die Tabellenmetadaten zu wechseln, um die
IDENTITY
Eigenschaft zu entfernen , die Aktualisierung durchzuführen und dann zurückzuschalten.Angenommen, die folgende Struktur
CREATE TABLE Test ( ID INT IDENTITY(1,1) PRIMARY KEY, X VARCHAR(10) ) INSERT INTO Test OUTPUT INSERTED.* SELECT 'Foo' UNION ALL SELECT 'Bar' UNION ALL SELECT 'Baz'
Dann können Sie tun
/*Define table with same structure but no IDENTITY*/ CREATE TABLE Temp ( ID INT PRIMARY KEY, X VARCHAR(10) ) /*Switch table metadata to new structure*/ ALTER TABLE Test SWITCH TO Temp; /*Do the update*/ UPDATE Temp SET ID = ID + 1; /*Switch table metadata back*/ ALTER TABLE Temp SWITCH TO Test; /*ID values have been updated*/ SELECT * FROM Test /*Safety check in case error in preceding step*/ IF NOT EXISTS(SELECT * FROM Temp) DROP TABLE Temp /*Drop obsolete table*/
In SQL Server 2012 ist es möglich, eine automatisch inkrementierende Spalte zu haben, mit der auch einfacher aktualisiert werden kann
SEQUENCES
CREATE SEQUENCE Seq AS INT START WITH 1 INCREMENT BY 1 CREATE TABLE Test2 ( ID INT DEFAULT NEXT VALUE FOR Seq NOT NULL PRIMARY KEY, X VARCHAR(10) ) INSERT INTO Test2(X) SELECT 'Foo' UNION ALL SELECT 'Bar' UNION ALL SELECT 'Baz' UPDATE Test2 SET ID+=1
quelle
Ändern Sie über die Benutzeroberfläche in SQL Server 2005 Manager die Spalte, und entfernen Sie die Eigenschaft für die automatische Nummerierung (Identität) der Spalte (wählen Sie die Tabelle aus, indem Sie mit der rechten Maustaste darauf klicken und "Design" auswählen).
Führen Sie dann Ihre Abfrage aus:
UPDATE table SET Id = Id + 1
Fügen Sie dann die Eigenschaft autonumber wieder zur Spalte hinzu.
quelle
Id
Auto-Identity-Werte um 1.Erstens funktioniert die Einstellung von IDENTITY_INSERT für diese Angelegenheit nicht für das, was Sie benötigen (sie wird zum Einfügen neuer Werte verwendet, z. B. zum Einfügen von Lücken).
Wenn Sie den Vorgang über die GUI ausführen, wird lediglich eine temporäre Tabelle erstellt, alle Daten werden in eine neue Tabelle ohne Identitätsfeld kopiert und die Tabelle umbenannt.
quelle
Dies kann mithilfe einer temporären Tabelle erfolgen.
Die Idee
SQL-Abfragen
Angenommen, Ihre
test
Tabelle enthält zwei zusätzliche Spalten (column2
undcolumn3
) und es gibt zwei Tabellen mit Fremdschlüsselreferenzen, dietest
alsforeign_table1
und bezeichnet werdenforeign_table2
(da Probleme im wirklichen Leben niemals einfach sind).alter table test nocheck constraint all; alter table foreign_table1 nocheck constraint all; alter table foreign_table2 nocheck constraint all; set identity_insert test on; select id + 1 as id, column2, column3 into test_copy from test v; delete from test; insert into test(id, column2, column3) select id, column2, column3 from test_copy alter table test check constraint all; alter table foreign_table1 check constraint all; alter table foreign_table2 check constraint all; set identity_insert test off; drop table test_copy;
Das ist es.
quelle
DBCC CHECKIDENT ('databaseenname.dbo.orders', RESEED, 999) Sie können mit diesem Befehl eine beliebige Identitätsspaltennummer ändern, und Sie können diese Feldnummer auch von jeder gewünschten Nummer aus starten. Beispiel: In meinem Befehl möchte ich beginnen 1000 (999 + 1) hoffen, dass es genug wäre ... viel Glück
quelle
Wenn die Spalte keine PK ist, können Sie jederzeit eine NEUE Spalte in der Tabelle mit den inkrementierten Zahlen erstellen, das Original löschen und dann die neue in die alte ändern.
Ich bin gespannt, warum Sie dies möglicherweise tun müssen. Das meiste, was ich jemals mit Identitätsspalten zu tun hatte, war das Auffüllen von Zahlen. Am Ende habe ich DBCC CHECKIDENT (Tabellenname, RESEED, newnextnumber) verwendet.
Viel Glück!
quelle
Die Änderung der Identität kann abhängig von einer Reihe von Faktoren fehlschlagen, die sich hauptsächlich um die mit der ID-Spalte verknüpften Objekte / Beziehungen drehen. Es scheint, als ob DB-Design hier genauso problematisch ist, wie sich IDs selten oder nie ändern sollten (ich bin sicher, Sie haben Ihre Gründe und kaskasieren die Änderungen). Wenn Sie die IDs von Zeit zu Zeit wirklich ändern müssen, würde ich vorschlagen, entweder eine neue Dummy-ID-Spalte zu erstellen, die nicht der Primärschlüssel / die Autonummer ist, die Sie selbst verwalten und aus den aktuellen Werten generieren können. Alternativ wäre die obige Idee von Chrisotphers mein anderer Vorschlag, wenn Sie Probleme mit dem Zulassen der Identitätseinfügung haben.
Viel Glück
PS: Es schlägt nicht fehl, weil in der Reihenfolge, in der es ausgeführt wird, versucht wird, einen Wert in der Liste auf ein Element zu aktualisieren, das bereits in der Liste der IDs vorhanden ist. Wenn Sie sich an Strohhalme klammern, addieren Sie möglicherweise die Anzahl der Zeilen + 1, und wenn dies funktioniert, subtrahieren Sie die Anzahl der Zeilen: -S
quelle
Wenn Sie die IDs gelegentlich ändern müssen, ist es wahrscheinlich am besten, keine Identitätsspalte zu verwenden. In der Vergangenheit haben wir Felder für die automatische Nummerierung manuell mithilfe einer 'Counters'-Tabelle implementiert, die die nächste ID für jede Tabelle verfolgt. IIRC haben wir dies getan, weil Identitätsspalten eine Datenbankbeschädigung in SQL2000 verursachten, aber das Ändern von IDs gelegentlich zum Testen nützlich war.
quelle
Sie können neue Zeilen mit geänderten Werten einfügen und dann alte Zeilen löschen. Im folgenden Beispiel ändern Sie die ID so, dass sie mit der PersonId des Fremdschlüssels übereinstimmt
SET IDENTITY_INSERT [PersonApiLogin] ON INSERT INTO [PersonApiLogin]( [Id] ,[PersonId] ,[ApiId] ,[Hash] ,[Password] ,[SoftwareKey] ,[LoggedIn] ,[LastAccess]) SELECT [PersonId] ,[PersonId] ,[ApiId] ,[Hash] ,[Password] ,[SoftwareKey] ,[LoggedIn] ,[LastAccess] FROM [db304].[dbo].[PersonApiLogin] GO DELETE FROM [PersonApiLogin] WHERE [PersonId] <> ID GO SET IDENTITY_INSERT [PersonApiLogin] OFF GO
quelle
Speichern Sie zuerst alle IDs und ändern Sie sie programmgesteuert auf die Werte, die Sie nicht möchten. Entfernen Sie sie dann aus der Datenbank und fügen Sie sie erneut mit etwas Ähnlichem ein:
use [Name.Database] go set identity_insert [Test] ON insert into [dbo].[Test] ([Id]) VALUES (2) set identity_insert [Test] OFF
Für Masseneinsätze verwenden:
use [Name.Database] go set identity_insert [Test] ON BULK INSERT [Test] FROM 'C:\Users\Oscar\file.csv' WITH (FIELDTERMINATOR = ';', ROWTERMINATOR = '\n', KEEPIDENTITY) set identity_insert [Test] OFF
Beispieldaten aus file.csv:
Wenn Sie nicht
identity_insert
ausschalten, wird der folgende Fehler angezeigt:quelle
Ich habe einen guten Artikel gesehen, der mir im letzten Moment geholfen hat. Ich habe versucht, einige Zeilen in eine Tabelle einzufügen, die eine Identitätsspalte hatte, dies aber falsch gemacht hat und zurück löschen musste. Nachdem ich die Zeilen gelöscht hatte, wurde meine Identitätsspalte geändert. Ich habe versucht, einen Weg zu finden, um die eingefügte Spalte zu aktualisieren, aber - kein Glück. Also, während der Suche auf Google einen Link gefunden ..
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
quelle
Sehr schöne Frage, zuerst müssen wir auf der IDENTITY_INSERT für die spezifische Tabelle, danach die Einfüge-Abfrage ausführen (muss den Spaltennamen angeben).
Hinweis: Nach dem Bearbeiten der die Identitätsspalte, nicht vergessen aus der IDENTITY. Wenn Sie dies nicht getan haben, können Sie die Identitätsspalte für keine andere Tabelle bearbeiten.
SET IDENTITY_INSERT Emp_tb_gb_Menu ON INSERT Emp_tb_gb_Menu(MenuID) VALUES (68) SET IDENTITY_INSERT Emp_tb_gb_Menu OFF
http://allinworld99.blogspot.com/2016/07/how-to-edit-identity-field-in-sql.html
quelle