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

SQL ALTER TABLE para principiantes

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, o DROP 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.