it-swarm-eu.dev

Aktualisieren Sie vorhandene Zeilen mit der Sequenznummer / dem Zeichen oder eindeutigen Daten

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.

13
med_alpa

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.

11
Jon Seigel

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
14
Mikael Eriksson

Die folgende Aktualisierung Spalte 'cn' mit Sequenznummer ab 1

DECLARE @id INT 
SET @id = 0 
UPDATE X
SET @id = cn = @id + 1 
GO 

http://www.mssqltips.com/sqlservertip/1467/populate-a-sql-server-column-with-a-sequential-number-not-using-an-identity/

10
zakir

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)
0
hewstone