Usuário com melhor resposta
Alterar uma tabela já existente

Pergunta
-
Bom dia a todos,
Aqui em meu trabalho há uma tabela que possui uma chave primaria somente, a mesma possui vários registros, há uma possibilidade de que eu alterar a estrutura da tabela para que ela agora tenha uma chave composta?
Não queria ter que criar essa tabela novamente.
Obrigado!
Att,
Respostas
-
Deleted
- Sugerido como Resposta Junior Galvão - MVPMVP sábado, 21 de julho de 2018 18:09
Todas as Respostas
-
Se o campo não fosse chave, sim voce pode adicionar um campo com ALTER TABLE. Exemplo:
ALTER TABLE suatabela ADD campo INT NULL;
O problema que no seu caso voce não vai poder usar esse método, pois se campo vai fazer parte de uma chave composta, o que significa que ela não poderá ser nula.
Eu sugiro:
- criar uma nova tabela, com a estutura da chave composta
- transferir os dados da antiga para a nova tabela
- recrirar as chaves estrangeiras (se ouver)
- apagar ou renomear a antiga tabela
- renomear a nova tabela com o nome da antiga
att
William John Adam Trindade
Analyste-programmeur
Sogi Informatique ltée
If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer". Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta". -
Deleted
- Sugerido como Resposta Junior Galvão - MVPMVP sábado, 21 de julho de 2018 18:09
-
Veja se o código abaixo te ajuda.
-- Testa preexistência da tabela para teste begin try drop table dbo.teste1 end try begin catch end catch; -- cria tabela de teste create table dbo.teste1 ( id int identity , cpf char(11) not null , nome varchar(100) ); -- cria primary key alter table dbo.teste1 add constraint ix_teste1_00 primary key (id); -- Verifica colunas do índice recém-criado select CONCAT(s.name, '.', t.name) as tabela , c.name as [Coluna índice] , i.name as [índice] from sys.schemas as s inner join sys.tables as t on s.schema_id = t.schema_id inner join sys.columns as c on t.object_id = c.object_id inner join sys.index_columns as ic on c.object_id = ic.object_id and c.column_id = ic.column_id inner join sys.indexes as i on ic.object_id = i.object_id and ic.index_id = i.index_id where s.name = 'dbo' and t.name = 'teste1' -- insere registros insert into dbo.teste1 values (replicate('1', 11), 'Fulado1') , (replicate('2', 11), 'Fulado2') , (replicate('3', 11), 'Fulado3') , (replicate('4', 11), 'Fulado4') , (replicate('5', 11), 'Fulado5'); -- Exibe registros select * from dbo.teste1; -- Exclui índice alter table dbo.teste1 drop constraint ix_teste1_00 -- Cria índice composto alter table dbo.teste1 add constraint ix_teste1_00 primary key (id, cpf); -- Verifica colunas do índice recém-criado select CONCAT(s.name, '.', t.name) as tabela , c.name as [Coluna índice] , i.name as [índice] from sys.schemas as s inner join sys.tables as t on s.schema_id = t.schema_id inner join sys.columns as c on t.object_id = c.object_id inner join sys.index_columns as ic on c.object_id = ic.object_id and c.column_id = ic.column_id inner join sys.indexes as i on ic.object_id = i.object_id and ic.index_id = i.index_id where s.name = 'dbo' and t.name = 'teste1' -- Obs: AS colunas em chaves primárias não podem ser nullables