Fügen Sie der vorhandenen Tabelle eine Spalte hinzu und nummerieren Sie sie in MS SQL Server eindeutig

121

Ich möchte einer vorhandenen Legacy- Datenbank eine Spalte hinzufügen und eine Prozedur schreiben , mit der ich jedem Datensatz einen anderen Wert zuweisen kann. So etwas wie das Hinzufügen einer Spalte und das automatische Generieren der Daten dafür.

Wenn ich beispielsweise eine neue Spalte mit dem Namen "ID" (Nummer) hinzufüge, möchte ich jedem Datensatz einen eindeutigen Wert zuweisen. Meine ID- Spalte enthält also Datensätze von beispielsweise 1 to 1000.
Wie mache ich das?

Adhip Gupta
quelle
2
Dies wird datenbankspezifisch sein. Sie sollten angeben, mit welcher Datenbank Sie arbeiten.
Dvorak
1
Sie sollten Ihre Frage bearbeiten, um dies zu erwähnen.
dvorak

Antworten:

221

Dies hängt von der Datenbank ab. Für SQL Server kann dies jedoch wie folgt erreicht werden:

alter table Example
add NewColumn int identity(1,1)
Simon Johnson
quelle
5
Das hat wunderbar funktioniert und alle benötigten Nummern automatisch hinzugefügt. Vielen Dank!
Djangofan
9
Wenn Sie Probleme haben, Änderungen an der Management Studio-Benutzeroberfläche vorzunehmen, können Sie die Einstellungen unter / Tools / Options / Designer / Table und Database Desiger ändern. Wenn Sie dieses Kontrollkästchen Prevent saving changes that require table re-creationdeaktivieren, können Sie auch mithilfe der Option eine Identitätsspalte hinzufügen gui.
Surfmuggle
22

Es wäre hilfreich, wenn Sie die von Ihnen verwendete SQL-Datenbank veröffentlichen würden. Für MySQL möchten Sie wahrscheinlich auto_increment:

ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY

Ich bin mir nicht sicher, ob dies die Werte rückwirkend anwendet. Wenn dies nicht der Fall ist, sollten Sie nur in der Lage sein, Ihre Werte mit einer gespeicherten Prozedur oder in einem einfachen Programm zu durchlaufen (solange niemand anderes in die Datenbank schreibt) und die LAST_INSERT_ID()Funktion zum Generieren des ID-Werts zu verwenden.

Tom Martin
quelle
7
Ich kann genauso gut bestätigen, dass dies tatsächlich für MySQL funktioniert. Ich habe gerade ein inkrementierendes ID-Feld zu einer vorhandenen nicht indizierten Tabelle hinzugefügt, und jede Zeile hat eine eindeutige neue ID erhalten.
Doug Kavendek
Tut mir leid, es ist alt, aber im Titel stand SQL Server.
Nick
11

Für Orakel könnte man so etwas wie unten machen

alter table mytable add (myfield integer);

update mytable set myfield = rownum;
Roy Tang
quelle
8

Und das Postgres-Äquivalent (die zweite Zeile ist nur obligatorisch, wenn "id" ein Schlüssel sein soll):

ALTER TABLE tableName ADD id SERIAL;
ALTER TABLE tableName ADD PRIMARY KEY (id);
Flavien Volken
quelle
3

Versuchen Sie dies für den Datentyp UNIQUEIDENTIFIER in SQL Server

Alter table table_name
add ID UNIQUEIDENTIFIER not null unique default(newid())

Wenn Sie einen Primärschlüssel aus dieser Spalte erstellen möchten, verwenden Sie diesen

ALTER TABLE table_name
ADD CONSTRAINT PK_name PRIMARY KEY (ID);
Snziv Gupta
quelle
0

Hängt von der Datenbank ab, da jede Datenbank eine andere Möglichkeit hat, Sequenznummern hinzuzufügen. Ich würde die Tabelle ändern, um die Spalte hinzuzufügen, und dann ein DB-Skript in groovy / python / etc schreiben, um die Daten einzulesen und die ID mit einer Sequenz zu aktualisieren. Sobald die Daten festgelegt wurden, würde ich der Tabelle eine Sequenz hinzufügen, die nach der obersten Nummer beginnt. Stellen Sie nach dem Einstellen der Daten die Primärschlüssel richtig ein.

Joshua
quelle
0

Wenn Sie nicht möchten, dass Ihre neue Spalte vom Typ ist IDENTITY(automatische Inkrementierung), oder wenn Sie genau festlegen möchten, in welcher Reihenfolge Ihre Zeilen nummeriert sind, können Sie eine Spalte vom Typ hinzufügen INT NULLund diese dann wie folgt füllen. In meinem Beispiel heißt die neue Spalte MyNewColumn und die vorhandene Primärschlüsselspalte für die Tabelle heißt MyPrimaryKey.

UPDATE MyTable
SET MyTable.MyNewColumn = AutoTable.AutoNum
FROM
(
    SELECT MyPrimaryKey, 
    ROW_NUMBER() OVER (ORDER BY SomeColumn, SomeOtherColumn) AS AutoNum
    FROM MyTable 
) AutoTable
WHERE MyTable.MyPrimaryKey = AutoTable.MyPrimaryKey  

Dies funktioniert in SQL Server 2005 und höher, dh in Versionen, die dies unterstützen ROW_NUMBER()

Jinlye
quelle