Sie können die vorhandenen Spalten für die Identität nicht ändern.
Sie haben 2 Möglichkeiten,
Erstellen Sie eine neue Tabelle mit Identität und löschen Sie die vorhandene Tabelle
Erstellen Sie eine neue Spalte mit Identität und löschen Sie die vorhandene Spalte
Vorgehensweise 1. ( Neue Tabelle ) Hier können Sie die vorhandenen Datenwerte in der neu erstellten Identitätsspalte beibehalten.
CREATE TABLE dbo.Tmp_Names
(
Id int NOT NULL
IDENTITY(1, 1),
Name varchar(50) NULL
)
ON [PRIMARY]
go
SET IDENTITY_INSERT dbo.Tmp_Names ON
go
IF EXISTS ( SELECT *
FROM dbo.Names )
INSERT INTO dbo.Tmp_Names ( Id, Name )
SELECT Id,
Name
FROM dbo.Names TABLOCKX
go
SET IDENTITY_INSERT dbo.Tmp_Names OFF
go
DROP TABLE dbo.Names
go
Exec sp_rename 'Tmp_Names', 'Names'
Ansatz 2 ( Neue Spalte ) Sie können die vorhandenen Datenwerte in der neu erstellten Identitätsspalte nicht beibehalten. Die Identitätsspalte enthält die Zahlenfolge.
Alter Table Names
Add Id_new Int Identity(1, 1)
Go
Alter Table Names Drop Column ID
Go
Exec sp_rename 'Names.Id_new', 'ID', 'Column'
Weitere Informationen finden Sie im folgenden Beitrag zum Microsoft SQL Server-Forum:
So ändern Sie die Spalte in Identität (1,1)
IDENTITY(1, 1)
In SQL 2005 und höher gibt es einen Trick, um dieses Problem zu lösen, ohne die Datenseiten der Tabelle zu ändern. Dies ist wichtig für große Tabellen, bei denen das Berühren jeder Datenseite Minuten oder Stunden dauern kann. Der Trick funktioniert auch dann, wenn die Identitätsspalte ein Primärschlüssel ist, Teil eines gruppierten oder nicht gruppierten Index oder anderer Fallstricke ist, die die einfachere Lösung "Spalte hinzufügen / entfernen / umbenennen" auslösen können.
Hier ist der Trick: Mit der Anweisung ALTER TABLE ... SWITCH von SQL Server können Sie das Schema einer Tabelle ändern, ohne die Daten zu ändern. Dies bedeutet, dass Sie eine Tabelle durch eine IDENTITY durch ein identisches Tabellenschema, jedoch ohne eine IDENTITY-Spalte ersetzen können. Der gleiche Trick funktioniert, um einer vorhandenen Spalte IDENTITY hinzuzufügen.
Normalerweise wird ALTER TABLE ... SWITCH verwendet, um eine vollständige Partition in einer partitionierten Tabelle effizient durch eine neue, leere Partition zu ersetzen. Es kann aber auch in nicht partitionierten Tabellen verwendet werden.
Ich habe diesen Trick verwendet, um in weniger als 5 Sekunden eine Spalte einer 2,5-Milliarden-Zeilentabelle von IDENTITY in eine Nicht-IDENTITY zu konvertieren (um eine mehrstündige Abfrage auszuführen, deren Abfrageplan für Nicht-IDENTITY besser funktioniert Spalten) und stellte dann die IDENTITY-Einstellung in weniger als 5 Sekunden wieder her.
Hier ist ein Codebeispiel, wie es funktioniert.
Dies ist offensichtlich aufwändiger als die Lösungen in anderen Antworten, aber wenn Ihr Tisch groß ist, kann dies ein echter Lebensretter sein. Es gibt einige Einschränkungen:
Es gibt einen guten Artikel über TechNet, in dem die oben genannten Anforderungen aufgeführt sind.
UPDATE - Eric Wu hatte unten einen Kommentar, der wichtige Informationen zu dieser Lösung hinzufügt. Kopieren Sie es hier, um sicherzustellen, dass es mehr Aufmerksamkeit erhält:
Wenn die Tabelle aktiv um neue Zeilen erweitert wird (was bedeutet, dass zwischen dem Hinzufügen von IDENTITY und dem Hinzufügen neuer Zeilen nicht viel Ausfallzeit besteht, möchten
DBCC CHECKIDENT
Sie stattdessen den Identitätsstartwert im neuen Tabellenschema manuell festlegen Größer als die größte vorhandene ID in der Tabelle, zIDENTITY (2435457, 1)
. B. Sie können möglicherweise sowohl dieALTER TABLE...SWITCH
als auch dieDBCC CHECKIDENT
in eine Transaktion einbeziehen (oder nicht - haben dies nicht getestet), aber das manuelle Festlegen des Startwerts scheint einfacher und sicherer zu sein.Wenn der Tabelle keine neuen Zeilen hinzugefügt werden (oder sie werden nur gelegentlich hinzugefügt, wie bei einem täglichen ETL-Prozess), tritt diese Race-Bedingung natürlich nicht auf, daher
DBCC CHECKIDENT
ist dies in Ordnung.quelle
DBCC CHECKIDENT('<newTableName>')
sofort nach dem Umschalten zu laufen . Weitere Informationen finden Sie unter msdn.microsoft.com/en-us/library/ms176057.aspx .Sie können eine Spalte nicht als IDENTITY-Spalte ändern. Sie müssen lediglich eine neue Spalte erstellen, die von Anfang an als IDENTITÄT definiert ist. Löschen Sie dann die alte Spalte und benennen Sie die neue in den alten Namen um.
Marc
quelle
Hier wird eine coole Lösung beschrieben: SQL SERVER - Hinzufügen oder Entfernen der Identitätseigenschaft in der Spalte
Bearbeiten Sie kurz Ihre Tabelle manuell in SQL Manager, wechseln Sie die Identität, SPEICHERN SIE KEINE Änderungen, zeigen Sie einfach das Skript an, das für die Änderungen erstellt wird, kopieren Sie es und verwenden Sie es später.
Dies spart viel Zeit, da es (das Skript) alle Fremdschlüssel, Indizes usw. enthält, die sich auf die von Ihnen geänderte Tabelle beziehen. Manuell schreiben ... Gott bewahre.
quelle
Erwägen Sie, SEQUENCE anstelle von IDENTITY zu verwenden .
In SQL Server 2014 (ich weiß nichts über niedrigere Versionen) können Sie dies einfach mithilfe der Sequenz tun.
Von hier aus: Sequenz als Standardwert für eine Spalte
quelle
Einfache Erklärung
Benennen Sie die vorhandene Spalte mit sp_RENAME um
EXEC sp_RENAME 'Table_Name.Existing_ColumnName', 'New_ColumnName', 'COLUMN'
Beispiel für Umbenennen:
Die vorhandene Spalte UserID wird in OldUserID umbenannt
Fügen Sie dann mithilfe der Änderungsabfrage eine neue Spalte hinzu, um sie als Primärschlüssel und Identitätswert festzulegen
Beispiel für Set Primary Key
Der neu erstellte Spaltenname lautet UserID
Löschen Sie dann die umbenannte Spalte
Beispiel für eine umbenannte Drop-Spalte
Jetzt fügen wir der vorhandenen Spalte in der Tabelle einen Primärschlüssel und eine Identität hinzu.
quelle
Ich bin ein Java-Entwickler, der zufällig in ein Team ohne DBA eingestiegen ist und in dem ich als Entwickler keine DBA-Rechte erhalten kann. Ich wurde beauftragt, ein ganzes Schema zwischen zwei Datenbanken zu verschieben. Ohne DBA musste ich dies tun und Skripte ausführen, da ich die GUI in SQL Server 2008 nicht verwenden konnte, weil ich keine Administratorrechte hatte.
Alles wurde ohne Probleme verschoben. Als ich jedoch eine gespeicherte Prozedur in der neuen schema.table ausführte, stellte ich fest, dass ich das Identitätsfeld in einer Tabelle verloren hatte. Ich habe das Skript, mit dem die Tabelle erstellt wurde, noch einmal überprüft und es war vorhanden. SQL Server hat es jedoch nicht erhalten, als ich das Skript ausgeführt habe. Ein DBA sagte mir später, dass er das gleiche Problem schon einmal gesehen habe.
Für SQL Server 2008 sind dies auf jeden Fall die Schritte, die ich unternommen habe, um dieses Problem zu lösen, und sie haben funktioniert. Daher veröffentliche ich dies hier in der Hoffnung, dass es jemandem helfen wird. Dies habe ich getan, da ich FK-Abhängigkeiten von einer anderen Tabelle hatte, was dies schwieriger machte:
Ich habe diese Abfrage verwendet, um zu überprüfen, ob die Identität tatsächlich fehlt, und um Abhängigkeiten von der Tabelle anzuzeigen.
1.) Statistiken zu einer Tabelle finden:
2.) Erstellen Sie eine doppelte, identische neue Tabelle, außer fügen Sie ein Identitätsfeld in das PK-Feld ein, in dem es zuvor war.
3.) Deaktivieren Sie die Identität, um Daten zu verschieben.
4.) Übertragen Sie die Daten.
5.) Überprüfen Sie, ob die Daten vorhanden sind.
6.) Aktivieren Sie die Identität erneut.
7.) Dies ist das beste Skript, das ich gefunden habe, um alle FK-Beziehungen zu erhalten, um zu überprüfen, auf welche Tabelle (n) die ursprüngliche Tabelle als Abhängigkeiten verweist, und ich bin auf viele gestoßen, also ist es ein Bewahrer!
8.) Stellen Sie vor diesem nächsten Schritt sicher, dass Sie alle PK- und FK-Skripte für alle beteiligten Tabellen haben.
9.) Sie können mit der rechten Maustaste auf jeden Schlüssel klicken und dieses Skript mit SQL Server 2008 ausführen
10.) Löschen Sie die FKs mit dieser Syntax aus den Abhängigkeitstabellen:
11.) Legen Sie die Originaltabelle ab:
13.) Diese nächsten Schritte basieren auf den Skripten, die Sie in Schritt 9 in SQL Server 2008 erstellt haben.
- Fügen Sie die PK der neuen Tabelle hinzu.
- Fügen Sie den FK zur neuen Tabelle hinzu.
- Fügen Sie die FKs wieder zur Abhängigkeitstabelle hinzu.
14.) Überprüfen Sie, ob alles korrekt und vollständig ist. Ich habe die GUI verwendet, um die Tabellen anzusehen.
15.) Benennen Sie die neue Tabelle in den ursprünglichen Tabellennamen um.
Endlich hat alles geklappt!
quelle
Sie können es nicht so machen, Sie müssen eine weitere Spalte hinzufügen, die ursprüngliche Spalte löschen und die neue Spalte umbenennen oder oder eine neue Tabelle erstellen, die Daten kopieren und die alte Tabelle löschen, gefolgt vom Umbenennen der neuen Tabelle in die alte Tabelle
Wenn Sie SSMS verwenden und die Identitätseigenschaft im Designer auf ON setzen, führt SQL Server hinter den Kulissen Folgendes aus. Wenn Sie also eine Tabelle mit dem Namen [Benutzer] haben, geschieht dies, wenn Sie Benutzer-ID und Identität festlegen
Trotzdem gibt es eine Möglichkeit, die Systemtabelle zu hacken, um dies durch Setzen des bitweisen Werts zu erreichen, aber das wird nicht unterstützt und ich würde es nicht tun
quelle
Wie ich im Normalfall verstanden habe, erstellen wir eine Tabelle mit einem Primärschlüssel mit der Eigenschaft "Identität".
Das Umbenennen oder Löschen einer Spalte, die der Primärschlüsseleinschränkung zugeordnet ist , ist daher nicht möglich, da die Einschränkungsregeln die Spaltenstruktur validieren.
Um dies zu erreichen, müssen wir einige Schritte folgendermaßen ausführen :
Nehmen wir an, TableName = 'Employee' und ColumnName = 'EmployeeId'
1. Fügen Sie der Tabelle 'Employee' eine neue Spalte 'EmployeeId_new' hinzu.
ALTER TABLE Employee ADD EmployeeId_new INT IDENTITY ( 1,1)
Entfernen Sie nun die Spalte 'EmployeeId' aus der Tabelle 'Employee'.
ALTER TABLE Employee DROP COLUMN EmployeeId
Dies führt zu Fehlern, da die Regeln für die Einschränkung des Primärschlüssels anwendbar sind und die Spaltenstruktur überprüft wird.
* ### 'Nachricht 5074, Ebene 16, Status 1, Zeile 1 Das Objekt [PK_dbo.Employee] ist abhängig von Spalte [EmployeeId].' ###
Daher müssen wir zuerst die Primärschlüsseleinschränkung aus der Tabelle 'Mitarbeiter' entfernen und dann die Spalte
ALTER TABLE Employee DROP-Einschränkung [PK_dbo.Employee] entfernen.
Jetzt können wir die Spalte 'EmployeeId' aus der Tabelle 'Employee' entfernen, wie im vorherigen Schritt, in dem der Fehler
ALTER TABLE Employee DROP COLUMN EmployeeId angezeigt wurde
Jetzt wurde die Spalte 'EmployeeId' aus der Tabelle entfernt. Daher werden wir die neu hinzugefügte neue Spalte 'EmployeeId_new' mit 'EmployeeId'
sp_rename 'Employee.EmployeeId', 'EmployeeId_new', 'COLUMN' umbenennen.
Um die Tabelle in der gleichen Form wie zuvor neu anzuordnen , müssen wir die Primärschlüsseleinschränkung für die Spalte 'EmployeeId'
hinzufügen. ALTER TABLE Employee Add Constraint [PK_dbo.Employee] Primärschlüssel (EmployeeId)
8. Jetzt wird die Tabelle 'Employee' mit 'EmployeeId' für Identitätsregeln zusammen mit der vorhandenen Primärschlüsseleinschränkung geändert
quelle
Es gibt keine einfache Möglichkeit, die Identitätsfunktion für eine vorhandene Spalte zu aktivieren oder zu deaktivieren. Die einzige saubere Möglichkeit, dies zu tun, besteht darin, eine neue Spalte zu erstellen und sie zu einer Identitätsspalte zu machen oder eine neue Tabelle zu erstellen und Ihre Daten zu migrieren.
Wenn wir SQL Server Management Studio verwenden, um den Identitätswert in der Spalte "id" zu entfernen, wird eine neue temporäre Tabelle erstellt, die Daten werden in die temporäre Tabelle verschoben, die alte Tabelle wird gelöscht und die neue Tabelle wird umbenannt.
Verwenden Sie Management Studio, um die Änderung vorzunehmen, klicken Sie mit der rechten Maustaste in den Designer und wählen Sie "Änderungsskript generieren".
Sie werden sehen, dass SQL Server dies im Hintergrund tut.
quelle
Leider gibt es keinen; Die IDENTITY-Eigenschaft gehört eher zur Tabelle als zur Spalte.
Der einfachere Weg ist es, dies in der GUI zu tun. Wenn dies jedoch keine Option ist, können Sie die Daten weitestgehend kopieren, die Spalte löschen, sie erneut mit Identität hinzufügen und die Daten zurücksetzen.
Sehen Sie hier für ein Blow-by-Blow - Konto.
quelle
Klicken Sie im Objekt-Explorer mit der rechten Maustaste auf den Tabellennamen. Sie erhalten einige Optionen. Klicken Sie auf "Design". Für diese Tabelle wird eine neue Registerkarte geöffnet. Sie können hier unter 'Spalteneigenschaften' eine Identitätsbeschränkung hinzufügen.
quelle
So ändern Sie die Identitätseigenschaften für eine Spalte:
Das war's und es hat bei mir funktioniert
quelle
Wenn Sie Visual Studio 2017+ verwenden
Dies wird alles für Sie tun.
quelle
Wenn das ursprüngliche Poster tatsächlich eine vorhandene Spalte als a
PRIMARY KEY
für die Tabelle festlegen wollte und die Spalte eigentlich keineIDENTITY
Spalte sein musste (zwei verschiedene Dinge), kann dies über t-SQL erfolgen mit:Beachten Sie die Klammer um den Spaltennamen nach der
PRIMARY KEY
Option.Obwohl dieser Beitrag alt ist und ich davon ausgehe, dass die Anforderer ihn benötigen, waren diese zusätzlichen Informationen für Benutzer, die auf diesen Thread stoßen, hilfreich, da ich der Meinung bin, dass die Konversation zu der Annahme führen könnte, dass eine vorhandene Spalte nicht als a festgelegt werden kann Primärschlüssel, ohne ihn zuerst als neue Spalte hinzuzufügen, was falsch wäre.
quelle
Nach meinem derzeitigen Zustand verfolge ich diesen Ansatz. Ich möchte einer Primärtabelle nach dem Einfügen von Daten per Skript eine Identität geben.
Da ich die Identität anhängen möchte, beginnt sie immer von 1 bis zum Ende der Datensatzanzahl, die ich möchte.
Dadurch wird dieselbe Primärschlüsselspalte mit Identität erstellt
Ich habe diese Links verwendet: https://blog.sqlauthority.com/2014/10/11/sql-server-add-auto-incremental-identity-column-to-table-after-creating-table/
Primärschlüssel zur vorhandenen Tabelle hinzufügen
quelle
Ich glaube nicht, dass Sie eine vorhandene Spalte mit tsql in eine Identitätsspalte ändern können. Sie können dies jedoch über die Enterprise Manager-Entwurfsansicht tun.
Alternativ können Sie eine neue Zeile als Identitätsspalte erstellen, die alte Spalte löschen und dann Ihre neue Spalte umbenennen.
quelle
Grundsätzlich gibt es vier logische Schritte.
Erstellen Sie eine neue Identitätsspalte. Aktivieren Sie Identität für diese neue Spalte einfügen.
Fügen Sie die Daten aus der Quellenspalte (der Spalte, die Sie in Identität konvertieren möchten) in diese neue Spalte ein.
Deaktivieren Sie die Option Identität für die neue Spalte einfügen.
Löschen Sie Ihre Quellenspalte und benennen Sie die neue Spalte in den Namen der Quellenspalte um.
Es kann einige komplexere Situationen geben, z. B. das Arbeiten auf mehreren Servern usw.
Weitere Informationen zu den Schritten finden Sie im folgenden Artikel (mit ssms & T-sql). Diese Schritte sind für Anfänger gedacht, die weniger Erfahrung mit T-SQL haben.
http://social.technet.microsoft.com/wiki/contents/articles/23816.how-to-convert-int-column-to-identity-in-the-ms-sql-server.aspx
quelle
generiert ein Skript für alle Tabellen mit Primärschlüssel = bigint, für die kein Identitätssatz festgelegt ist; Dadurch wird eine Liste der generierten Skripte für jede Tabelle zurückgegeben.
quelle