Wir haben eine 5-GB-Tabelle (fast 500 Millionen Zeilen) und möchten die Identitätseigenschaft in einer der Spalten entfernen. Wenn wir dies jedoch über SSMS versuchen, tritt eine Zeitüberschreitung auf.
Kann dies über T-SQL erfolgen?
sql
sql-server
tsql
Conrad Jagger
quelle
quelle
Antworten:
Sie können eine
IDENTITY
einmal festgelegte Spezifikation nicht entfernen .So entfernen Sie die gesamte Spalte:
Informationen zu ALTER TABLE hier
Wenn Sie die Daten behalten, aber die
IDENTITY
Spalte entfernen müssen , müssen Sie:IDENTITY
Spalte in die neue SpalteIDENTITY
Spalte.quelle
identity
Spalte als Teil einerforeign key
in einer anderen Tabelle verwendet wird, müssen Sie zuerst die Einschränkungen löschen und dann Maßnahmen ergreifen, wie @AdamWenger über das Entfernen der Identität erwähnt hat.attribute/property
Weitere Informationen finden Sie auch in diesem Link nur zum Entfernen des Attributs: blog.sqlauthority.com/2009/05/03/… ..Gen viel Glück!Wenn Sie dies tun möchten, ohne eine neue Spalte hinzuzufügen und zu füllen , ohne die Spalten neu zu ordnen und ohne Ausfallzeiten, da sich keine Daten in der Tabelle ändern, lassen Sie uns mit der Partitionierungsfunktion etwas zaubern (da jedoch keine Partitionen verwendet werden, sollten Sie dies nicht tun). brauche keine Enterprise Edition):
ALTER TABLE [Original] SWITCH TO [Original2]
exec sys.sp_rename
um die verschiedenen Schemaobjekte wieder in die ursprünglichen Namen umzubenennen, und erstellen Sie dann Ihre Fremdschlüssel neu.Zum Beispiel gegeben:
Sie können Folgendes tun:
quelle
Dies wird mit Fremd- und Primärschlüsseleinschränkungen unübersichtlich. Hier sind einige Skripte, die Ihnen auf Ihrem Weg helfen sollen:
Erstellen Sie zunächst eine doppelte Spalte mit einem temporären Namen:
Als Nächstes erhalten Sie den Namen Ihrer Primärschlüsseleinschränkung:
Versuchen Sie nun, die Primärschlüsseleinschränkung für Ihre Spalte zu löschen:
Wenn Sie Fremdschlüssel haben, schlägt dies fehl. Wenn dies der Fall ist, lassen Sie die Fremdschlüsseleinschränkungen fallen. Behalten Sie den Überblick darüber, für welche Tabellen Sie dies ausführen, damit Sie die Einschränkungen später wieder hinzufügen können !!!
Nachdem alle Fremdschlüsseleinschränkungen entfernt wurden, können Sie die PK-Einschränkung entfernen, diese Spalte löschen, Ihre temporäre Spalte umbenennen und die PK-Einschränkung zu dieser Spalte hinzufügen:
Fügen Sie abschließend die FK-Einschränkungen wieder hinzu in:
El Fin!
quelle
Select t.name 'Table', i.name 'Index', c.name 'Column', i.is_primary_key, i.is_unique From sys.tables t Inner Join sys.indexes i On i.object_id = t.object_id Inner Join sys.index_columns ic ON ic.object_id = i.object_id And i.index_id = ic.index_id Inner Join sys.columns c ON ic.object_id = c.object_id and ic.column_id = c.column_id Where t.name = 'tableName' Order By t.name, i.name, i.index_id, ic.index_column_id
Ich hatte gerade das gleiche Problem. 4 Anweisungen in SSMS anstelle der GUI und es war sehr schnell.
Erstellen Sie eine neue Spalte
alter table users add newusernum int;
Werte kopieren über
update users set newusernum=usernum;
Lass die alte Spalte fallen
alter table users drop column usernum;
Benennen Sie die neue Spalte in den alten Spaltennamen um
EXEC sp_RENAME 'users.newusernum' , 'usernum', 'COLUMN';
quelle
Das folgende Skript entfernt das Identitätsfeld für eine Spalte mit dem Namen 'Id'.
Ich hoffe es hilft.
quelle
Der folgende Code funktioniert einwandfrei, wenn wir den Namen der Identitätsspalte nicht kennen .
Müssen Daten in neue temporäre Tabelle wie kopieren
Invoice_DELETED
. und das nächste Mal verwenden wir:Weitere Erläuterungen finden Sie unter: https://dba.stackexchange.com/a/138345/101038
quelle
Der obige Code funktioniert jedoch nur, wenn keine Primär-Fremdschlüssel-Beziehung besteht
quelle
Nur für jemanden, der das gleiche Problem hat wie ich. Wenn Sie nur einmal eine Einfügung vornehmen möchten, können Sie so etwas tun.
Nehmen wir an, Sie haben eine Tabelle mit zwei Spalten
und möchten eine Zeile mit der ID = 4 einfügen. Sie setzen sie also auf 3, sodass die nächste 4 ist
Machen Sie den Einsatz
Und bringen Sie Ihren Samen zurück auf die höchste ID, nehmen wir an, er ist 15
Getan!
quelle
Ich hatte die gleiche Anforderung, und Sie könnten diese Methode ausprobieren, die ich Ihnen persönlich empfehle. Bitte entwerfen Sie Ihre Tabelle manuell und generieren Sie das Skript. Im Folgenden habe ich die alte Tabelle und auch deren Einschränkung für die Sicherung umbenannt.
quelle
In SQL Server können Sie das Einfügen von Identitäten wie folgt aktivieren und deaktivieren:
SET IDENTITY_INSERT Tabellenname EIN
- Führen Sie hier Ihre Abfragen aus
SET IDENTITY_INSERT Tabellenname AUS
quelle