2017-09-29 3 views
0

Wie kann ich meine IDENTITY Spalte in meiner bereits gefüllten Tabelle zurücksetzen?Wie kann ich die IDENTITY-Spalte meiner Tabelle in SQL Server zurücksetzen?

habe ich versucht, so etwas wie dieses, aber es funktioniert nicht

WITH TBL AS 
(
    SELECT 
     *, 
     ROW_NUMBER() OVER(ORDER BY profile_id) AS RN 
    FROM 
     Profiles 
) 
UPDATE TBL 
SET profile_id = RN 

ERROR:

Cannot update identity column 'profile_id'.

enter image description here

+1

Wenn Ihre Profil-ID automatisch erhöht wird, können Sie sie nicht aktualisieren. –

+0

Lassen Sie die Spalte fallen und fügen Sie sie erneut hinzu und aktualisieren Sie sie mit Zeilennummer. –

+0

Ja, es wurde auf automatische Erhöhung gesetzt. Nicht einmal danach SET IDENTITY_INSERT Profile ON – Biswa

Antwort

0

Soweit ich weiß, Sie keine Identitätsspalte aktualisieren kann. Wenn Sie die Identität beibehalten möchten (nachdem Sie ihre Werte geändert haben), besteht eine Möglichkeit darin, eine andere spiegelnde Tabelle (gleiche Felder) zu erstellen und alle Daten darin zu übertragen. So etwas (am Ende haben Sie eine Tabelle mit einem neuen IDENTITY-Feld).

Originaltabelle

CREATE TABLE TESTID (id iNT IDENTITY(1,1), DESCR VARCHAR(100), PROFILEID INT) 
INSERT INTO TESTID VALUES ('bbbb', 888); 
INSERT INTO TESTID VALUES ('Ccccc', 777); 

Neue Tabelle

CREATE TABLE TESTID2 (id INT IDENTITY(1,1), DESCR VARCHAR(100), PROFILEID INT) 

Datenübertragung

SET IDENTITY_INSERT TESTID2 ON 
INSERT INTO TESTID2 (ID, DESCR, PROFILEID) 
SELECT 100+ROW_NUMBER() OVER (ORDER BY PROFILEID) AS RN, DESCR, PROFILEID FROM TESTID 
SET IDENTITY_INSERT TESTID2 OFF 

-Test

INSERT INTO TESTID2 VALUES ('xxxx',999); 
SELECT * FROM TESTID; 


id   DESCR    PROFILEID 
----------- ----------------- ----------- 
101   Ccccc    777 
102   bbbb    888 
103   xxxx    999 

Wenn Sie möchten, können Sie Identität Startwert ändern

DBCC checkident ('TESTID2', reseed, 4000) 
INSERT INTO TESTID2 VALUES ('yyy',111) 

id   DESCR      PROFILEID 
----------- -------------------------- ----------- 
101   Ccccc      777 
102   bbbb      888 
103   xxxx      999 
4001  yyy      111 

Am Ende verwenden, Ihre ursprüngliche Tabelle löschen und die neuen umbenennen.

+1

Tanner hat bereits eine doppelte Frage getaggt, wo eine der Antworten eine einfachere Möglichkeit bietet - create eine neue Spalte anstelle der Tabelle – Nisarg

+0

Ich glaube nicht, dass dies der Rat sein sollte, da es dem OP oder zukünftigen Besuchern wahrscheinlich nicht helfen wird. Sie haben keine Fremdschlüssel berücksichtigt, die möglicherweise auf den Identitäten vorhanden sind. Ich würde sagen, in den meisten dbs sind PK's ziemlich oft mit einem oder vielen Dingen verbunden und dies zu tun, wo Links existieren, wird scheitern. – Tanner

+0

@Tanner es war nur ein Beispiel ... – etsa

0

Mit dem DBCC-Befehl "CHECKIDENT" können Sie den Identitätswert der Spalte in einer Tabelle zurücksetzen.

Zum Beispiel hat Identität Spalte 100 als die letzte Identität. Wenn wir nächste Zeile zu haben, eine Identität als 201, dann können Sie dies mit folgendem DBCC-Befehl erreichen -

DBCC CHECKIDENT (N'TableName', RESEED, 34); 

Ist die Identitätsspalte mit einer Identität von 1 mit dem nächsten Einsatz beginnen muss dann sollte die Tabelle erneut ausgesät wird mit der Identität zu 0.

Aber denken Sie daran, dabei verletzen Sie möglicherweise die Datenintegrität, die Eindeutigkeit der Tabellensätze.

+0

DBCC funktioniert in zukünftigen Zeilen, aber mein Fokus war, die vorhandenen Zeilen zurückzusetzen. – Biswa

Verwandte Themen