none
Alterar uma tabela já existente RRS feed

  • 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, 

    quarta-feira, 18 de julho de 2018 13:38

Respostas

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:

    1. criar uma nova tabela, com a estutura da chave composta
    2. transferir os dados da antiga para a nova tabela
    3. recrirar as chaves estrangeiras (se ouver)
    4. apagar ou renomear a antiga tabela
    5. 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".

    quarta-feira, 18 de julho de 2018 14:45
  • Deleted
    quarta-feira, 18 de julho de 2018 14:47
  • 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

    quarta-feira, 18 de julho de 2018 15:15