Atualizar linhas existentes com número / caractere squence ou qualquer dado exclusivo

13

Eu adicionei uma nova coluna na tabela X

Esta coluna "cn" deve ser exclusiva e obrigatória, mas os dados antigos não têm valor.

Como atualizar os registros existentes com dados exclusivos sequenciais ou aleatórios?

Obrigado.

med_alpa
fonte

Respostas:

11

Mesmo que eu ache que você já tenha criado a coluna, nesta resposta, suponho que a coluna ainda não exista. Na IMO, uma coluna obrigatória exclusiva nunca deve ser adicionada sem planejar como preencher as linhas existentes primeiro. Portanto, fornecerei os métodos para fazer isso a partir do zero.


Como você faz isso depende do que está envolvido no preenchimento dos valores.

Após o método usado, adicione uma restrição exclusiva na coluna para garantir a integridade dos dados. Para os métodos 1 e 2, isso pode ser feito na instrução única ou em uma transação do usuário (não mostrada) e deve ser feito na transação do usuário no método 3.

Provavelmente existem algumas outras maneiras obscuras de fazer isso, mas acho que abordamos as mais comuns.


Método 1: Adicionar uma coluna IDENTITY

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

Isso preencherá todas as linhas da tabela com valores inteiros começando com o valor inicial (1), aumentando o valor de incremento (2) para cada linha. Acredito que a ordem em que os valores são preenchidos é indefinida (se você precisar especificar uma ordem, use o Método 3).


Método 2: preencher usando uma restrição padrão

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

Isso fará três coisas atomicamente: 1. Adicione uma coluna que não permita NULLvalores; 2. Crie uma restrição padrão para a coluna; 3. Preencha cada linha da tabela usando a restrição padrão.

Embora este exemplo use uma uniqueidentifiercoluna, ele também funciona com qualquer tipo de dados e restrição padrão.


Método 3: preencher usando uma instrução UPDATE

Esse caso ocorreria quando, por exemplo, havia um valor de outra parte do seu aplicativo que precisava ser adicionado à tabela ou você precisava especificar uma ordem exata para os valores exclusivos.

BEGIN TRANSACTION

    ALTER TABLE MyTable ADD MyColumn int NULL

    UPDATE MyTable
        SET MyColumn = ...

    ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL

COMMIT TRANSACTION

Método 4: preencher usando um objeto SEQUENCE

Para o SQL Server 2012, você pode preencher uma coluna usando os valores gerados por um SEQUENCEobjeto - ainda não trabalhei com isso, por isso vou me referir a um artigo do MSDN para obter detalhes.

Jon Seigel
fonte
Obrigado a todos, usei o método 3 com uma combinação com a primeira resposta: atualizar T definir cn = rn de (selecione cn, número da linha () sobre (ordem de (selecione 1)) como rn da TabelaX) T
med_alpa
Exemplo de uso de sequência (supondo que você tenha uma sequência chamada sequência):update mytable set mycolumn = next value for mysequence where mycolumn is null;
Endy Tjahjono
14

Se você estiver satisfeito com um número começando de 1, poderá usá-lo row_number().

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

tente fazer isso para atualizar usando uma sequência ... Você deve executar o TOP devido à cláusula order by na instrução update. Eu usei essa declaração no 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)
pedra calcária
fonte
-1

E se tudo isso ainda não funcionar (talvez porque seja o SQL-92 antigo), você pode dividir isso em várias etapas, conforme sugerido por Ziggy Crueltyfree Zeitgeister, aqui .

CREATE TABLE sorting (sid numeric(10,10), rn int);

INSERT INTO sorting (sid, rn)
SELECT SortID, RecordNumber FROM Beleg
WHERE Year ( Valuta ) = 2016
AND Ursprungskonto = 1210
ORDER BY SortID;

UPDATE Beleg SET SortID = (SELECT rn FROM sorting WHERE sid=Beleg.SortID)
WHERE Year ( Valuta ) = 2016
AND Ursprungskonto = 1210;

DROP TABLE sorting;
Gary Czychi
fonte
O que é isso RecordNumber? Parece uma função / recurso proprietário do Filemaker. Não se aplica ao SQL Server e não no padrão SQL 92.
precisa saber é o seguinte
Sim, você está certo. RecordNumber é uma coluna calculada que você pode definir no Filemaker, que mantém o número do registro de cada linha quando é exibida na tela e depois de classificada (pelo Filemaker).
Gary Czychi
OK, bom, não sabia disso. Mas a pergunta aqui não está marcada, Filemakerentão não acho que a resposta seja relevante. Você pode usar uma tabela temporária e preencher essa coluna com a ROW_NUMBER()função.
precisa saber é o seguinte