Database
 sql >> Base de Dados >  >> RDS >> Database

SQL DROP COLUMN para iniciantes


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 , ou PRIMARY 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