Ich habe eine neue Spalte in Tabelle X hinzugefügt
Diese Spalte "cn" muss eindeutig und obligatorisch sein, aber alte Daten haben keinen Wert.
Wie aktualisiere ich die vorhandenen Datensätze mit sequenziellen oder zufälligen eindeutigen Daten?
Vielen Dank.
Obwohl ich denke, dass Sie die Spalte bereits erstellt haben, gehe ich in dieser Antwort davon aus, dass die Spalte noch nicht vorhanden ist. IMO sollte eine eindeutige erforderliche Spalte nie hinzugefügt werden, ohne zu planen, wie die vorhandenen Zeilen zuerst gefüllt werden sollen. Daher werde ich die Methoden bereitstellen, um dies ab Null zu tun.
Wie Sie dies tun, hängt davon ab, was beim Auffüllen der Werte erforderlich ist.
Fügen Sie nach der von Ihnen verwendeten Methode eine eindeutige Einschränkung für die Spalte hinzu, um die Datenintegrität sicherzustellen. Bei den Methoden 1 und 2 kann dies innerhalb der einzelnen Anweisung oder innerhalb einer Benutzertransaktion (nicht gezeigt) erfolgen und sollte innerhalb der Benutzertransaktion in Methode 3 erfolgen.
Es gibt wahrscheinlich ein paar andere obskure Möglichkeiten, dies zu tun, aber ich denke, ich habe die häufigsten behandelt.
Methode 1: Fügen Sie eine IDENTITY-Spalte hinzu
ALTER TABLE MyTable ADD MyColumn int IDENTITY(1, 2) NOT NULL
Dadurch werden alle Zeilen in der Tabelle mit ganzzahligen Werten gefüllt, die mit dem Startwert (1) beginnen und für jede Zeile um den Inkrementwert (2) erhöht werden. Ich glaube, die Reihenfolge, in der die Werte ausgefüllt werden, ist undefiniert (wenn Sie eine Reihenfolge angeben müssen, verwenden Sie Methode 3).
Methode 2: Füllen Sie mit einer Standardeinschränkung
ALTER TABLE MyTable ADD MyColumn uniqueidentifier NOT NULL
CONSTRAINT DF_MyTable_MyColumn
DEFAULT (NEWSEQUENTIALID())
Dies führt drei atomare Aktionen aus: 1. Fügen Sie eine Spalte hinzu, die keine NULL
-Werte zulässt. 2. Erstellen Sie eine Standardeinschränkung für die Spalte. 3. Füllen Sie jede Zeile in der Tabelle mit der Standardeinschränkung aus.
Während dieses Beispiel eine uniqueidentifier
-Spalte verwendet, funktioniert es genauso gut mit jedem Datentyp und jeder Standardeinschränkung.
Methode 3: Füllen Sie mit einer UPDATE-Anweisung
Dieser Fall tritt auf, wenn beispielsweise ein Wert aus einem anderen Teil Ihrer Anwendung zur Tabelle hinzugefügt werden muss oder Sie eine genaue Reihenfolge für die eindeutigen Werte angeben müssen.
BEGIN TRANSACTION
ALTER TABLE MyTable ADD MyColumn int NULL
UPDATE MyTable
SET MyColumn = ...
ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL
COMMIT TRANSACTION
Methode 4: Füllen Sie mit einem SEQUENCE-Objekt
Für SQL Server 2012 können Sie eine Spalte mit Werten füllen, die von einem SEQUENCE
-Objekt generiert wurden. Ich habe noch gar nicht damit gearbeitet, daher verweise ich auf einen MSDN-Artikel zur Vollständigkeit.
Wenn Sie mit einer Zahl ab 1 zufrieden sind, können Sie row_number()
verwenden.
update T
set cn = rn
from (
select cn,
row_number() over(order by (select 1)) as rn
from TableX
) T
Die folgende Aktualisierung Spalte 'cn' mit Sequenznummer ab 1
DECLARE @id INT
SET @id = 0
UPDATE X
SET @id = cn = @id + 1
GO
versuchen Sie dies, um mit einer Sequenz zu aktualisieren ... Sie müssen das TOP aufgrund der order by-Klausel in der update-Anweisung ausführen. Ich habe diese Anweisung in SQL Server 2012 verwendet
update invoice set RecNo = (next value for seq_invoice_recno)
where invoiceid in (select top 100000 invoiceid from invoice where RecNo is null
order by invoiceId)