No SQL, se você deseja remover uma coluna de uma tabela, você precisa usar o
ALTER TABLE
instrução com a DROP COLUMN
cláusula. Isso remove a coluna e todos os seus dados.
Sintaxe
A sintaxe fica assim:
ALTER TABLE table_name
DROP COLUMN column_name;
Alguns RDBMSs aceitam um opcional
IF EXISTS
argumento que significa que não retornará um erro se a coluna não existir. Alguns RDBMSs também aceitam
CASCADE
opcional e RESTRICT
argumentos, que especificam o que fazer se a coluna tiver alguma dependência. Veja abaixo mais sobre isso. Exemplo
Aqui está um exemplo para demonstrar.
ALTER TABLE Products
DROP COLUMN ProductDescription;
Isso remove a
ProductDescription
coluna de Products
tabela. O IF EXISTS
Argumento
Dependendo do seu RDBMS, você poderá usar o
IF EXISTS
argumento, que descarta condicionalmente a coluna somente se ela já existir. A vantagem de fazer isso é que você não receberá um erro se a coluna não existir.
Exemplo:
ALTER TABLE Products
DROP COLUMN IF EXISTS ProductDescription;
Restringir a alteração
Dependendo do seu RDBMS, você poderá usar o
CASCADE
e RESTRICT
argumentos para especificar o que fazer se a coluna tiver alguma dependência, como chaves estrangeiras ou exibições. RESTRICT
é normalmente o comportamento padrão, portanto, se você não especificar nenhum desses argumentos, o DBMS se recusará a descartar a coluna se houver objetos dependentes. Exemplo:
ALTER TABLE Products
DROP COLUMN ProductDescription RESTRICT;
Ao usar a instrução acima, se a coluna tiver alguma dependência, a operação de soltar falhará e você receberá um erro.
Aqui está o erro que recebo no PostgreSQL ao tentar descartar uma tabela referenciada por uma visualização:
cannot drop column productdescription of table products because other objects depend on it
Casca a mudança
Usando o
CASCADE
opção fará com que quaisquer objetos dependentes sejam descartados. Aqui está o que acontece se eu alterar o exemplo anterior para
CASCADE
:ALTER TABLE Products
DROP COLUMN ProductDescription CASCADE;
Resultado:
NOTICE: drop cascades to view vproducts Commands completed successfully
Nesse caso, a coluna foi descartada e recebi uma mensagem explicando que a visualização chamava
vproducts
também foi descartado. CASCADE
e RESTRICT
são suportados no PostgreSQL, mas não no SQL Server ou MySQL. Ambas as palavras-chave podem ser usadas no MariaDB, mas não têm nenhum efeito. A Oracle aceita uma
CASCADE CONSTRAINTS
cláusula que elimina todas as restrições de chave estrangeira que se referem às chaves primárias e exclusivas definidas nas colunas eliminadas, bem como todas as restrições de várias colunas definidas nas colunas eliminadas. Soltar várias colunas
Alguns RDBMs permitem que você solte várias colunas em um único
ALTER TABLE
demonstração. A sintaxe varia entre RDBMS. No SQL Server, você pode simplesmente listar cada coluna, separada por uma vírgula:
ALTER TABLE t1
DROP COLUMN c1, c2;
Em outros RDBMSs (como MySQL e PostgreSQL), você precisaria reescrever
DROP COLUMN
para cada coluna:ALTER TABLE t1
DROP COLUMN c1, DROP COLUMN c2;
Observe que essa sintaxe é uma extensão do SQL e não está em conformidade com o padrão SQL de ter apenas um
DROP
cláusula por ALTER TABLE
demonstração. Solte a última coluna
Alguns RDBMs permitem que você elimine a última coluna da tabela, deixando assim uma tabela vazia sem colunas. Esta é uma extensão do padrão SQL (que não permite tabelas de coluna zero).
Por exemplo, no PostgreSQL, usei a seguinte instrução para descartar a última coluna restante na tabela
ALTER TABLE t1
DROP COLUMN c3;
Resultado:
Commands completed successfully
Mas no SQL Server, se eu fizer o mesmo:
ALTER TABLE t1
DROP COLUMN c1, c2, c3;
Resultado:
Msg 4923, Level 16, State 1, Line 1 ALTER TABLE DROP COLUMN failed because 'c3' is the only data column in table 't1'. A table must have at least one data column.
Observe que, apesar do texto dessa mensagem de erro, c3 não era a única coluna restante. Na verdade, havia três colunas. No entanto, c3 teria sido o último restante se os outros dois tivessem sido descartados. Nesse caso, nenhuma das três colunas foi realmente descartada.
De qualquer forma, mesmo se eu descartasse os outros dois, o SQL Server se recusaria a descartar o último.
O MySQL também se recusa a descartar a última coluna em uma tabela.
Se sua intenção é remover a tabela, use
DROP TABLE
. Restrições por RDBMS
Embora a
DROP COLUMN
básica sintaxe é bastante semelhante na maioria dos principais RDBMSs, cada RDBMS tende a ter suas próprias restrições para quando uma coluna será ou não descartada. Aqui estão algumas das restrições de alguns dos principais RDBMSs.
SQL Server
Uma coluna não pode ser descartada quando:
- Usado em um índice, seja como coluna chave ou como
INCLUDE
- Usado em um
CHECK
,FOREIGN KEY
,UNIQUE
, ouPRIMARY KEY
restrição. - Associado a um padrão definido com o
DEFAULT
palavra-chave ou vinculado a um objeto padrão. - Ligado a uma regra.
Fonte para SQL Server:https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql
MySQL
Se as colunas forem eliminadas de uma tabela, as colunas também serão removidas de qualquer índice do qual façam parte. Se todas as colunas que compõem um índice forem eliminadas, o índice também será eliminado.
Fonte para MySQL:https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
PostgreSQL
Índices e restrições de tabela envolvendo a coluna também serão descartados automaticamente.
As estatísticas multivariadas que fazem referência à coluna descartada também serão removidas se a remoção da coluna fizer com que as estatísticas contenham dados para apenas uma única coluna.
Você precisará usar
CASCADE
se algo fora da tabela depender da coluna, por exemplo, chaves estrangeiras ou visualizações. Fonte para PostgreSQL:https://www.postgresql.org/docs/current/sql-altertable.html
SQLite
SQLite não suporta
DROP COLUMN
sintaxe. Você não pode soltar uma coluna no SQLite. Se você precisar soltar uma coluna no SQLite, é recomendável seguir o processo de 12 etapas recomendado na documentação do SQLite.
Fonte para SQLite:https://sqlite.org/lang_altertable.html#otheralter
MariaDB
Se a coluna fizer parte de qualquer índice, a coluna será removida deles, exceto se você adicionar uma nova coluna com nome idêntico ao mesmo tempo. O índice será eliminado se todas as colunas do índice forem eliminadas. Se a coluna foi usada em uma visualização ou gatilho, você receberá um erro na próxima vez que a visualização ou gatilho for acessado.
Do MariaDB 10.2.8, descartando uma coluna que faz parte de um
UNIQUE
de várias colunas restrição não é permitida. MariaDB aceita
RESTRICT
e CASCADE
para facilitar a portabilidade de outros sistemas de banco de dados, mas no MariaDB, eles não fazem nada. MariaDB 10.4.0 suporta
DROP COLUMN
instantâneo . DROP COLUMN
de uma coluna indexada implicaria em DROP INDEX
(e no caso de um não-UNIQUE
índice de várias colunas, possivelmente ADD INDEX
). Isso não será permitido com ALGORITHM=INSTANT
, mas diferentemente de antes, eles podem ser permitidos com ALGORITHM=NOCOPY
. Fonte para MariaDB:https://mariadb.com/kb/en/alter-table/#drop-column