sql >> Base de Datos >  >> RDS >> Database

SQL DROP COLUMN para principiantes

En SQL, si desea eliminar una columna de una tabla, debe usar ALTER TABLE declaración con la DROP COLUMN cláusula.

Eso elimina la columna y todos sus datos.

Sintaxis

La sintaxis es así:

ALTER TABLE table_name 
DROP COLUMN column_name;

Algunos RDBMS aceptan un IF EXISTS opcional argumento que significa que no devolverá un error si la columna no existe.

Algunos RDBMS también aceptan CASCADE opcional y RESTRICT argumentos, que especifican qué hacer si la columna tiene alguna dependencia. Consulte a continuación para obtener más información sobre esto.

Ejemplo

Aquí hay un ejemplo para demostrarlo.

ALTER TABLE Products 
DROP COLUMN ProductDescription;

Esto elimina el ProductDescription columna de Products mesa.

El IF EXISTS Argumento

Dependiendo de su RDBMS, es posible que pueda usar IF EXISTS argumento, que descarta condicionalmente la columna solo si ya existe.

El beneficio de hacer esto es que no obtendrá un error si la columna no existe.

Ejemplo:

ALTER TABLE Products
DROP COLUMN IF EXISTS ProductDescription;

Restringir el Cambio

Dependiendo de su RDBMS, es posible que pueda usar CASCADE y RESTRICT argumentos para especificar qué hacer si la columna tiene alguna dependencia, como claves externas o vistas.

RESTRICT suele ser el comportamiento predeterminado, por lo que si no especifica ninguno de estos argumentos, el DBMS se negará a descartar la columna si hay objetos dependientes.

Ejemplo:

ALTER TABLE Products
DROP COLUMN ProductDescription RESTRICT;

Al usar la declaración anterior, si la columna tiene alguna dependencia, la operación de eliminación fallará y obtendrá un error.

Este es el error que me sale en PostgreSQL cuando intento eliminar una tabla a la que hace referencia una vista:

cannot drop column productdescription of table products because other objects depend on it

Cadena de cambios

Usando la CASCADE La opción hará que se eliminen todos los objetos dependientes.

Esto es lo que sucede si cambio el ejemplo anterior a CASCADE :

ALTER TABLE Products
DROP COLUMN ProductDescription CASCADE;

Resultado:

NOTICE: drop cascades to view vproducts
Commands completed successfully

En este caso, la columna se eliminó y recibí un mensaje que explicaba que la vista se llamaba vproducts también se eliminó.

CASCADE y RESTRICT son compatibles con PostgreSQL, pero no con SQL Server o MySQL. Ambas palabras clave se pueden usar en MariaDB pero no tienen ningún efecto.

Oracle acepta CASCADE CONSTRAINTS cláusula que descarta todas las restricciones de clave externa que se refieren a las claves primarias y únicas definidas en las columnas eliminadas, así como todas las restricciones de varias columnas definidas en las columnas eliminadas.

Soltar varias columnas

Algunos RDBM le permiten colocar varias columnas dentro de una sola ALTER TABLE declaración. La sintaxis varía entre RDBMS.

En SQL Server, simplemente puede enumerar cada columna, separada por una coma:

ALTER TABLE t1 
DROP COLUMN c1, c2;

En otros RDBMS (como MySQL y PostgreSQL), deberá volver a escribir DROP COLUMN para cada columna:

ALTER TABLE t1 
DROP COLUMN c1, DROP COLUMN c2;

Tenga en cuenta que esta sintaxis es una extensión de SQL y no se ajusta al estándar SQL de tener solo un DROP cláusula por ALTER TABLE declaración.

Soltar la última columna

Algunos RDBM le permiten eliminar la última columna de la tabla y, por lo tanto, dejar una tabla vacía sin columnas. Esta es una extensión del estándar SQL (que no permite tablas de cero columnas).

Por ejemplo, en PostgreSQL, usé la siguiente declaración para eliminar la última columna restante en la tabla

ALTER TABLE t1 
DROP COLUMN c3;

Resultado:

Commands completed successfully

Pero en SQL Server, si hago lo mismo:

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.

Tenga en cuenta que, a pesar de la redacción de este mensaje de error, c3 no era la única columna restante. En realidad había tres columnas. Sin embargo, c3 habría sido la última que quedaba si las otras dos se hubieran descartado. En este caso, ninguna de las tres columnas se eliminó realmente.

De cualquier manera, incluso si eliminé los otros dos, SQL Server se negaría a eliminar el último.

MySQL también se niega a eliminar la última columna de una tabla.

Si su intención es eliminar la tabla, use DROP TABLE .

Restricciones por RDBMS

Aunque el DROP COLUMN básico La sintaxis es bastante similar en la mayoría de los principales RDBMS, cada RDBMS tiende a tener sus propias restricciones sobre cuándo se eliminará o no una columna.

Estas son algunas de las restricciones de algunos de los principales RDBMS.

Servidor SQL

Una columna no se puede eliminar cuando es:

  • Usado en un índice, ya sea como columna clave o como INCLUDE
  • Usado en un CHECK , FOREIGN KEY , UNIQUE , o PRIMARY KEY restricción.
  • Asociado con un valor predeterminado que se define con DEFAULT palabra clave, o vinculado a un objeto predeterminado.
  • Atado a una regla.

Fuente de SQL Server:https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-table-transact-sql

MySQL

Si las columnas se quitan de una tabla, las columnas también se quitan de cualquier índice del que formen parte. Si se eliminan todas las columnas que componen un índice, el índice también se eliminará.

Fuente para MySQL:https://dev.mysql.com/doc/refman/8.0/en/alter-table.html

PostgreSQL

Los índices y las restricciones de tabla que involucran la columna también se eliminarán automáticamente.

Las estadísticas multivariadas que hacen referencia a la columna eliminada también se eliminarán si la eliminación de la columna hace que las estadísticas contengan datos para una sola columna.

Deberá usar CASCADE si algo fuera de la tabla depende de la columna, por ejemplo, claves externas o vistas.

Fuente de PostgreSQL:https://www.postgresql.org/docs/current/sql-altertable.html

SQLite

SQLite no es compatible con DROP COLUMN sintaxis. No puede soltar una columna en SQLite.

Si necesita colocar una columna en SQLite, se recomienda que siga el proceso de 12 pasos recomendado en la documentación de SQLite.

Fuente de SQLite:https://sqlite.org/lang_altertable.html#otheralter

MariaDB

Si la columna es parte de cualquier índice, la columna se eliminará de ellos, excepto si agrega una nueva columna con el mismo nombre al mismo tiempo. El índice se descartará si se eliminaron todas las columnas del índice. Si la columna se usó en una vista o activador, obtendrá un error la próxima vez que acceda a la vista o al activador.

Desde MariaDB 10.2.8, soltando una columna que es parte de un UNIQUE de varias columnas la restricción no está permitida.

MariaDB acepta RESTRICT y CASCADE para facilitar la transferencia desde otros sistemas de bases de datos, pero en MariaDB, no hacen nada.

MariaDB 10.4.0 admite DROP COLUMN instantáneos . DROP COLUMN de una columna indexada implicaría DROP INDEX (y en el caso de un no UNIQUE índice de varias columnas, posiblemente ADD INDEX ). No se permitirán con ALGORITHM=INSTANT , pero a diferencia de antes, se pueden permitir con ALGORITHM=NOCOPY .

Fuente para MariaDB:https://mariadb.com/kb/en/alter-table/#drop-column