Como remover uma coluna de uma tabela existente?
Eu tenho uma mesa MENcom FnameeLname
Preciso remover o Lname
Como fazer isso?
Como remover uma coluna de uma tabela existente?
Eu tenho uma mesa MENcom FnameeLname
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 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}
constraintuma 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 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
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;