En SQL, la ALTER TABLE
instrucción modifica la definición de una tabla existente.
Puedes usar ALTER TABLE
para modificar, agregar o eliminar columnas y restricciones.
Dependiendo de su DBMS, la ALTER TABLE
La declaración también se puede usar para reasignar y reconstruir particiones, o deshabilitar y habilitar restricciones y disparadores.
Sintaxis
La ALTER TABLE
declaración generalmente es así:
ALTER TABLE table_name
[alter_option [, alter_option] ...]
[partition_options]
Dónde:
table_name
es el nombre de la tabla que desea modificar.[alter_option [, alter_option] …]
es una lista de los cambios específicos que desea realizar (por ejemplo,ADD
seguido del nombre de la columna y la definición, oDROP COLUMN
seguido del nombre de la columna, etc.).[partition_options]
es una lista opcional de opciones específicamente para tablas particionadas. No todos los DBMS admiten tablas particionadas. Si el suyo lo hace, dichas opciones pueden permitirle agregar, eliminar, descartar, importar, fusionar o dividir particiones, o realizar el mantenimiento de particiones.
La sintaxis completa para ALTER TABLE
puede ser bastante complejo y varía significativamente entre los DBMS. Para todo lo que no esté cubierto en este artículo, consulte la documentación de su DBMS.
A continuación se muestran ejemplos de las ALTER TABLE
más comunes operaciones.
Agregar una nueva columna
Para agregar una nueva columna a una tabla, use ADD
cláusula, seguida del nombre de la columna y el tipo de datos.
ALTER TABLE Products
ADD ProductDescription varchar(500);
Esto agrega una nueva columna llamada ProductDescription
a los Products
mesa.
En este ejemplo, convertimos la columna en varchar(500)
pero usaría cualquier tipo de datos que sea apropiado para su nueva columna.
También puede incluir restricciones en la definición de su columna, pero esto puede depender de su DBMS y de si la tabla ya contiene datos o no (consulte la discusión a continuación sobre esto).
Renombrar una columna
La mayoría de los principales RDBMS (PostgreSQL, Oracle, SQLite, MySQL 8.0+, MariaDB 10.5.2+) le permiten cambiar el nombre de una columna como esta:
ALTER TABLE table_name
RENAME COLUMN column_name TO new_column_name;
Si usa MySQL antes de la versión 8.0 o MariaDB antes de la 10.5.2+, deberá usar CHANGE COLUMN
sintaxis en su lugar, que también requiere que vuelva a especificar el tipo de datos. Me gusta esto:
ALTER TABLE table_name
CHANGE COLUMN old_column_name new_column_name datatype;
En SQL Server, deberá usar sp_rename
procedimiento almacenado para cambiar el nombre de una columna. Así:
EXEC sp_rename 'schema_name.table_name.column_name', 'new_column_name', 'COLUMN';
Soltar una columna
Para soltar una columna, use DROP COLUMN
cláusula, seguida del nombre de la columna.
ALTER TABLE table_name
DROP COLUMN column_name;
Modificar la definición de una columna
La sintaxis para modificar la definición de una columna existente varía significativamente entre DBMS. También depende de las modificaciones que necesites hacer.
Para mantener las cosas simples, hagamos una modificación simple a una columna en SQL Server:
ALTER TABLE Products
ALTER COLUMN ProductDescription varchar(1000);
En este ejemplo, cambiamos el ProductDescription
columna de varchar(500)
a varchar(1000)
.
A continuación se muestra la sintaxis básica requerida por cada DBMS para realizar cambios iguales o similares.
Servidor SQL:
ALTER TABLE table_name
ALTER COLUMN column_name datatype;
PostgreSQL:
ALTER TABLE table_name
ALTER COLUMN column_name TYPE datatype;
MySQL, MariaDB y Oracle anteriores a 10g:
ALTER TABLE table_name
MODIFY COLUMN column_name datatype;
En Oracle 10g y posteriores:
ALTER TABLE table_name
MODIFY column_name datatype;
SQLite no le permitirá modificar una columna, excepto cambiarle el nombre.
La sintaxis real para cada DBMS suele ser mucho más compleja que esto y depende exactamente de lo que esté tratando de hacer. Sin embargo, esto debería ayudarlo a comenzar con las modificaciones básicas de las columnas.
Restricciones y consideraciones
Por lo general, debe evitar realizar modificaciones en las tablas una vez que contienen datos. Al realizar cambios, corre el riesgo de perder los datos existentes.
Habiendo dicho eso, muchos DBMS en realidad le impiden realizar ciertos cambios una vez que una tabla contiene datos. Por ejemplo, es posible que no pueda agregar un NOT NULL
restricción a una columna que contiene datos.
Algunos DBMS pueden permitirle hacerlo, siempre que use un DEFAULT
restricción (para proporcionar un valor predeterminado para las columnas a las que no se les han insertado datos explícitamente), o una columna de Identidad/incremento automático, o una columna de marca de tiempo, etc.
Algunos DBMS no le permiten eliminar o cambiar columnas en una tabla.
Además, algunos DBMS restringen los tipos de datos que se pueden agregar.
Ejemplo:agregar una restricción NOT NULL
Aquí hay un ejemplo para ayudar a demostrar los puntos anteriores.
Esto es lo que sucede cuando intento agregar una columna con un NOT NULL
restricción en SQL Server.
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL;
Resultado:
Msg 4901, Level 16, State 1, Line 1 ALTER TABLE only allows columns to be added that can contain nulls, or have a DEFAULT definition specified, or the column being added is an identity or timestamp column, or alternatively if none of the previous conditions are satisfied the table must be empty to allow addition of this column. Column 'ProductDescription' cannot be added to non-empty table 'Products' because it does not satisfy these conditions.
Básicamente, la tabla ya contiene datos, por lo que SQL Server devuelve un error que me dice que solo puedo agregar un NOT NULL
restricción si la tabla cumple con ciertos criterios y aún no cumple con esos criterios.
Y hay una buena razón para ese criterio.
A NOT NULL
restricción asegura que no hay NULL
valores en la columna en cualquier fila. El problema es que ya tenemos datos en la tabla y si agregamos una nueva columna, esas filas existentes serán NULL
– lo que violará inmediatamente nuestro NOT NULL
restricción. Entonces necesitamos especificar datos para ir a las filas existentes.
Para hacer esto, podemos agregar un DEFAULT
restricción o similar para garantizar que las filas existentes se llenen automáticamente con datos en esta columna.
Ejemplo:
ALTER TABLE Products
ADD ProductDescription varchar(500) NOT NULL DEFAULT 'N/A';
Esto simplemente agrega un DEFAULT
restricción a la columna. Esta restricción garantiza que todas las filas contengan un valor (en este caso, el valor es N/A
) si no se les ha asignado un valor. Esto significa que nuestro NOT NULL
la restricción no se violará, porque todas las filas existentes ahora contendrán un valor.
Si la nueva columna necesita tener valores incrementales únicos, puede convertirla en una IDENTITY
columna (o AUTOINCREMENT
en SQLite y otros DBMS).
Sin embargo, si la tabla aún no contiene datos, es posible que pueda agregar la columna sin tener que realizar ninguno de estos pasos.
Opciones de partición
Este artículo está dirigido a principiantes, y las tablas particionadas están un poco fuera del alcance de un tutorial para principiantes.
Habiendo dicho eso, repasaré rápidamente algunas de las opciones de partición con respecto a ALTER TABLE
declaración.
Si su DBMS admite tablas particionadas, probablemente también proporcione opciones de partición con ALTER TABLE
declaración.
Por ejemplo, en MySQL podría hacer lo siguiente:
ALTER TABLE Products
PARTITION BY HASH(ProductId)
PARTITIONS 8;
Esto divide la tabla en 8 particiones, por HASH
, usando el ProductId
columna como la clave de partición.
PARTITION BY HASH
utiliza el resto de la expresión (en este caso, el ProductId
columna) dividido por el número de particiones (es decir, el módulo).
También puede utilizar particiones de rango. Así es como puede agregar una partición de rango a una tabla existente:
ALTER TABLE Products
ADD PARTITION (PARTITION Partition9 VALUES LESS THAN (2020));
Este ejemplo implica que los Products
la tabla ya tiene 8 particiones de rango, y estamos agregando otra partición llamada Partition9
.
Puede eliminar particiones como esta:
ALTER TABLE Products
DROP PARTITION Partition8, Partition9;
Tenga en cuenta que estos ejemplos son para MySQL.
También he escrito algunos artículos sobre tablas particionadas en SQL Server. Con respecto a la ALTER TABLE
declaración, aquí se explica cómo cambiar una partición y aquí se explica cómo cambiar una partición (ambos se realizan con ALTER TABLE
).
En SQL Server, algunas opciones de partición deben realizarse con otras declaraciones. Por ejemplo, la fusión de particiones se realiza con ALTER PARTITION FUNCTION
y la división de particiones se realiza con ALTER PARTITION SCHEME
declaración.
Si desea obtener más información acerca de las tablas particionadas en SQL Server, aquí le mostramos cómo crear una tabla particionada en SQL Server.
ALTER TABLE
en SQLite
También debo mencionar que SQLite tiene un soporte muy limitado de ALTER TABLE
declaración. En SQLite, la ALTER TABLE
le permite cambiar el nombre de una tabla, cambiar el nombre de una columna dentro de una tabla o agregar una nueva columna a una tabla existente.
Cualquier otro cambio requerirá que sueltes la tabla y comiences de nuevo. Esto también se aplica a la adición de claves externas.