Como remover uma coluna de uma tabela existente?
Eu tenho uma mesa MEN
com Fname
eLname
Preciso remover o Lname
Como fazer isso?
Como remover uma coluna de uma tabela existente?
Eu tenho uma mesa MEN
com Fname
eLname
Preciso remover o Lname
Como fazer isso?
Respostas:
ALTER TABLE MEN DROP COLUMN Lname
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
Essa é a resposta correta:
ALTER TABLE MEN DROP COLUMN Lname
Mas ... se um CONSTRAINT
existe no COLUMN
, então você deve DROP
o CONSTRAINT
primeiro, então você vai ser capaz de DROP
o COLUMN
. Para eliminar um CONSTRAINT
, execute:
ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
constraint
uma coluna ?
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 drops
na coluna somente se, exists
na tabela, não gerar erro.
Em vez de usar IF
wrappers grandes para verificar a existência de column
antes de descartá-lo, basta executar a DDL
instrução acima
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
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:
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.
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.
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.
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 ()
Sintaxe:
ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;
Por exemplo:
alter table Employee drop column address;