it-swarm-eu.dev

Aktualizujte stávající řádky pořadovým číslem / znakem nebo jakýmikoli jedinečnými daty

Do tabulky X jsem přidal nový sloupec

Tento sloupec „cn“ musí být jedinečný a povinný, ale stará data nemají žádnou hodnotu.

Jak aktualizovat stávající záznamy sekvenčně nebo náhodně jedinečnými daty?

Děkuju.

13
med_alpa

I když si myslím, že jste sloupec již vytvořili, v této odpovědi předpokládám, že tento sloupec dosud neexistuje. IMO, jedinečný povinný sloupec by měl být přidán nikdy bez plánování, jak naplnit existující řádky první. Proto poskytnu metody, jak toho dosáhnout, počínaje nulou.


Jak to uděláte, záleží na tom, co se podílí na naplnění hodnot.

Po použití libovolné metody přidejte do sloupce jedinečné omezení, abyste zajistili integritu dat. U metod 1 a 2 to lze provést v rámci jednoho příkazu nebo v rámci uživatelské transakce (není zobrazeno) a mělo by být provedeno v rámci uživatelské transakce v metodě 3.

Pravděpodobně existuje několik dalších nejasných způsobů, jak to udělat, ale myslím, že jsem se zabýval nejběžnějšími.


Metoda 1: Přidejte sloupec IDENTITY

ALTER TABLE MyTable ADD MyColumn int IDENTITY(1, 2) NOT NULL

Tím se naplní všechny řádky v tabulce celočíselnými hodnotami začínajícími počátečními hodnotami (1), zvyšujícími se o přírůstkovou hodnotu (2) pro každý řádek. Věřím, že pořadí, ve kterém jsou hodnoty naplněny, není definováno (pokud musíte určit objednávku, použijte metodu 3).


Metoda 2: Vyplnění pomocí výchozího omezení

ALTER TABLE MyTable ADD MyColumn uniqueidentifier NOT NULL
    CONSTRAINT DF_MyTable_MyColumn
        DEFAULT (NEWSEQUENTIALID())

To provede atomicky tři věci: 1. Přidejte sloupec, který nepovoluje hodnoty NULL; 2. Vytvořte výchozí omezení pro sloupec; 3. Vyplňte každý řádek v tabulce pomocí výchozího omezení.

I když tento příklad používá sloupec uniqueidentifier, funguje stejně dobře s jakýmkoli typem dat a výchozím omezením.


Metoda 3: Vyplnění pomocí příkazu UPDATE

Tento případ by nastal, když například existuje hodnota z jiné části aplikace, kterou je třeba přidat do tabulky, nebo je třeba zadat přesnou objednávku pro jedinečné hodnoty.

BEGIN TRANSACTION

    ALTER TABLE MyTable ADD MyColumn int NULL

    UPDATE MyTable
        SET MyColumn = ...

    ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL

COMMIT TRANSACTION

Metoda 4: Vyplnění pomocí objektu SEQUENCE

Pro SQL Server 2012 můžete naplnit sloupec pomocí hodnot generovaných objektem SEQUENCE - s tím jsem ještě nepracoval, takže se budu odkazovat na článek MSDN pro úplnost.

11
Jon Seigel

Pokud jste spokojeni s číslem začínajícím od 1, můžete použít row_number().

update T
set cn = rn
from (
       select cn,
              row_number() over(order by (select 1)) as rn
       from TableX
     ) T
14
Mikael Eriksson

Následující sloupec „cn“ aktualizuje pořadovým číslem začínajícím od 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

zkuste to aktualizovat pomocí sekvence ... Musíte udělat TOP kvůli pořadí podle klauzule v aktualizačním příkazu. Toto prohlášení jsem použil na serveru SQL SERVER 2012

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