Adicione uma coluna à tabela existente e os numere exclusivamente no MS SQL Server


121

Quero adicionar uma coluna a um banco de dados legado existente e escrever um procedimento pelo qual eu possa atribuir a cada registro um valor diferente. Algo como adicionar uma coluna e gerar automaticamente os dados para ela.

Por exemplo, se eu adicionar uma nova coluna chamada "ID" (número), desejo inicializar um valor exclusivo para cada um dos registros. Portanto, minha coluna de ID terá registros de digamos 1 to 1000.
Como faço isso?


2
Isso será específico do banco de dados. Você deve especificar em qual banco de dados está trabalhando.
dvorak

1
Você deve editar sua pergunta para mencionar isso.
Dvorak

Respostas:


221

Isso dependerá do banco de dados, mas para o SQL Server, isso pode ser alcançado da seguinte maneira:

alter table Example
add NewColumn int identity(1,1)

5
Isso funcionou lindamente e adicionou todos os números que eu precisava automaticamente. Obrigado!
djangofan

9
Se você tiver problemas para alterar o GUI do estúdio de gerenciamento, poderá alterar as configurações em / Ferramentas / Opções / Designer / Tabela e banco de dados Desiger, encontrará uma caixa de seleção Prevent saving changes that require table re-creationdesmarcar essa caixa e poderá adicionar uma coluna de identidade, mesmo usando o gui.
Surfmuggle 5/11

22

Ajudaria se você publicasse qual banco de dados SQL você está usando. Para o MySQL, você provavelmente deseja auto_increment:

ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY

Não tenho certeza se isso aplica os valores retroativamente. Caso contrário, você deve ser capaz de iterar seus valores com um procedimento armazenado ou em um programa simples (desde que ninguém mais esteja gravando no banco de dados) e defina use a LAST_INSERT_ID()função para gerar o valor do ID.


7
Posso também confirmar que isso realmente funciona para o MySQL; Acabei de adicionar um campo de ID incremental a uma tabela não indexada existente e cada linha tem um novo ID exclusivo.
Doug Kavendek

Desculpe, é um antigo, mas ele diz SQL server no título.
Nick

11

para Oracle você poderia fazer algo como abaixo

alter table mytable add (myfield integer);

update mytable set myfield = rownum;

8

E o equivalente ao Postgres (a segunda linha é obrigatória apenas se você quiser que "id" seja uma chave):

ALTER TABLE tableName ADD id SERIAL;
ALTER TABLE tableName ADD PRIMARY KEY (id);


3

para tipo de dados UNIQUEIDENTIFIER no servidor sql, tente isso

Alter table table_name
add ID UNIQUEIDENTIFIER not null unique default(newid())

Se você deseja criar uma chave primária a partir dessa coluna, use este

ALTER TABLE table_name
ADD CONSTRAINT PK_name PRIMARY KEY (ID);

0

Depende do banco de dados, pois cada banco de dados possui uma maneira diferente de adicionar números de sequência. Eu alteraria a tabela para adicionar a coluna e, em seguida, escreveria um script db em groovy / python / etc para ler os dados e atualizar o ID com uma sequência. Uma vez que os dados foram definidos, eu adicionaria uma sequência à tabela que inicia após o número superior. Depois que os dados forem definidos, defina as chaves primárias corretamente.


0

Se você não deseja que sua nova coluna seja do tipo IDENTITY(incremento automático) ou deseja ser específico sobre a ordem em que suas linhas são numeradas, você pode adicionar uma coluna do tipo INT NULLe preenchê-la dessa maneira. No meu exemplo, a nova coluna é chamada MyNewColumn e a coluna de chave primária existente para a tabela é chamada MyPrimaryKey.

UPDATE MyTable
SET MyTable.MyNewColumn = AutoTable.AutoNum
FROM
(
    SELECT MyPrimaryKey, 
    ROW_NUMBER() OVER (ORDER BY SomeColumn, SomeOtherColumn) AS AutoNum
    FROM MyTable 
) AutoTable
WHERE MyTable.MyPrimaryKey = AutoTable.MyPrimaryKey  

Isso funciona no SQL Sever 2005 e posterior, ou seja, versões que suportam ROW_NUMBER()

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.