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
, oPRIMARY 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