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.
fonte
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.
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 NULL
valores; 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 uniqueidentifier
coluna, 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 SEQUENCE
objeto - ainda não trabalhei com isso, por isso vou me referir a um artigo do MSDN para obter detalhes.
update mytable set mycolumn = next value for mysequence where mycolumn is null;
Se você estiver satisfeito com um número começando de 1, poderá usá-lo
row_number()
.fonte
A seguinte coluna de atualizações 'cn' com o número de sequência iniciando em 1
http://www.mssqltips.com/sqlservertip/1467/populate-a-sql-server-column-with-a-sequential-number-not-using-an-identity/
fonte
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
fonte
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 .
fonte
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.Filemaker
então não acho que a resposta seja relevante. Você pode usar uma tabela temporária e preencher essa coluna com aROW_NUMBER()
função.