Como remover uma coluna de uma tabela existente?

Respostas:

661
ALTER TABLE MEN DROP COLUMN Lname
jcomeau_ictx
fonte
157

Genérico:

ALTER TABLE table_name DROP COLUMN column_name;

No seu caso:

ALTER TABLE MEN DROP COLUMN Lname;
reggie
fonte
72

Seu exemplo é simples e não requer nenhuma alteração adicional na tabela, mas, em geral, isso não é tão trivial.

Se essa coluna for referenciada por outras tabelas, você precisará descobrir o que fazer com outras tabelas / colunas. Uma opção é remover chaves estrangeiras e manter os dados referenciados em outras tabelas.

Outra opção é encontrar todas as colunas de referência e removê-las também, se não forem mais necessárias.

Nesses casos, o verdadeiro desafio é encontrar todas as chaves estrangeiras. Você pode fazer isso consultando as tabelas do sistema ou usando ferramentas de terceiros, como o ApexSQL Search (gratuito) ou o Red Gate Dependency Tracker (premium, mas com mais recursos). Existe um tópico inteiro sobre chaves estrangeiras aqui

John Moore
fonte
47

Essa é a resposta correta:

ALTER TABLE MEN DROP COLUMN Lname

Mas ... se um CONSTRAINTexiste no COLUMN, então você deve DROPo CONSTRAINTprimeiro, então você vai ser capaz de DROPo COLUMN. Para eliminar um CONSTRAINT, execute:

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
Aaron Lelevier
fonte
ALTER TABLE tb_name DROP FOREIGN KEY key_name
bortunac
3
COMO procurar constraintuma coluna ?
Kiquenet
21

No SQL Server 2016, você pode usar novas instruções DIE.

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

A consulta acima pode ser executada novamente dropsna coluna somente se, existsna tabela, não gerar erro.

Em vez de usar IFwrappers grandes para verificar a existência de columnantes de descartá-lo, basta executar a DDLinstrução acima

P ரதீப்
fonte
3
O que é declarações DIE ?
Kiquenet
3
A propósito, você pode chamar esses tipos de scripts / funções "re-executáveis" Idempotent
tomosius
4
essa deve ser a resposta aceita. Se você tiver implementações automatizadas de scripts sql, precisará escrever seus scripts defensivamente dessa maneira.
victor
7

A questão é: você pode excluir apenas uma coluna de uma tabela inexistente ;-)

BEGIN TRANSACTION

IF exists (SELECT * FROM  sys.columns c 
INNER JOIN  sys.objects t ON (c.[object_id] = t.[object_id])
WHERE t.[object_id] = OBJECT_ID(N'[dbo].[MyTable]')
AND c.[name] = 'ColumnName')
    BEGIN TRY
        ALTER TABLE [dbo].[MyTable] DROP COLUMN ColumnName
    END TRY
    BEGIN CATCH
        print 'FAILED!'
    END CATCH
ELSE
    BEGIN 
        SELECT ERROR_NUMBER() AS ErrorNumber;
        print 'NO TABLE OR COLUMN FOUND !'
    END 

COMMIT  
Tad
fonte
11
Suponho que se você queria deixar uma coluna de uma tabela não mais existiam, esta seria a maneira de fazê-lo
Matiaan
6

A resposta simples para isso é usar o seguinte:

ALTER TABLE MEN DROP COLUMN Lname;

Mais de uma coluna pode ser especificada assim:

ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;

No SQL Server 2016, também é possível soltar a coluna apenas se ela existir. Isso impede que você receba um erro quando a coluna não existe, algo que você provavelmente não se importa.

ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;

Existem alguns pré-requisitos para descartar colunas. As colunas descartadas não podem ser:

  • Usado por um índice
  • Usado pelas restrições CHECK, FOREIGN KEY, UNIQUE ou PRIMARY KEY
  • Associado a um DEFAULT
  • Vinculado a uma regra

Se qualquer uma das opções acima for verdadeira, você precisará descartar essas associações primeiro.

Além disso, deve-se observar que a eliminação de uma coluna não recupera o espaço do disco rígido até que o índice clusterizado da tabela seja reconstruído. Como tal, geralmente é uma boa ideia seguir o procedimento acima com um comando de reconstrução de tabela como este:

ALTER TABLE MEN REBUILD;

Finalmente, como alguns disseram, isso pode ser lento e provavelmente trancará a mesa durante o período. É possível criar uma nova tabela com a estrutura desejada e renomear assim:

SELECT 
   Fname 
   -- Note LName the column not wanted is not selected
INTO 
   new_MEN
FROM
   MEN;

EXEC sp_rename 'MEN', 'old_MEN';
EXEC sp_rename 'new_MEN', 'MEN';

DROP TABLE old_MEN;

Mas esteja avisado de que existe aqui uma janela para perda de dados das linhas inseridas entre o primeiro comando select e o último renomear.

Martin Brown
fonte
2

Para adicionar colunas na tabela existente:

ALTER TABLE table_name
 ADD
 column_name DATATYPE NULL  

Para excluir colunas na tabela existente:

ALTER TABLE table_name
DROP COLUMN column_name
mithun
fonte
Pergunta não sobre colunas ADD .
Kiquenet
2

Isso também pode ser feito através da GUI do SSMS. O bom desse método é que ele avisa se há algum relacionamento nessa coluna e também pode excluí-lo automaticamente.

  1. Coloque a tabela no modo Design (clique com o botão direito na tabela) da seguinte forma:

insira a descrição da imagem aqui

  1. Clique com o botão direito do mouse na coluna na visualização Design da tabela e clique em "Excluir coluna"

insira a descrição da imagem aqui

Como afirmei anteriormente, se houver algum relacionamento que também precise ser excluído, nesse momento, será perguntado se você deseja excluí-lo. Você provavelmente precisará fazer isso para excluir a coluna.

Tony L.
fonte
0

Se você estiver usando C # e a coluna Identity for int, crie uma nova instância de int sem fornecer nenhum valor a ele. Isso funcionou para mim.

[identidade_coluna] = nova int ()

EA Lehn
fonte
O que esta resposta fará? Isso removerá a coluna da tabela?
Prashant Pimpale 23/09/19
0

Sintaxe:

ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;

Por exemplo:

alter table Employee drop column address;
Anand Pipalwa
fonte