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.
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.
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
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
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)