CREATE TABLE
CREATE TABLE define una nueva tabla.
Sintaxis admitida
CREATE TABLE [ IF NOT EXISTS ] table_name ( [ { column_name data_type [ STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ] [ column_constraint [ ... ] ] | table_constraint | LIKE source_table [ like_option ... ] } [, ... ] ] ) where column_constraint is: [ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK ( expression ) | DEFAULT default_expr | GENERATED ALWAYS AS ( generation_expr ) STORED | GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY ( sequence_options ) | UNIQUE [ NULLS [ NOT ] DISTINCT ] index_parameters | PRIMARY KEY index_parameters | REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] and table_constraint is: [ CONSTRAINT constraint_name ] { CHECK ( expression ) | UNIQUE [ NULLS [ NOT ] DISTINCT ] ( column_name [, ... ] ) index_parameters | PRIMARY KEY ( column_name [, ... ] ) index_parameters | FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH FULL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE referential_action ] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] and referential_action in a FOREIGN KEY/REFERENCES constraint is: { NO ACTION | RESTRICT | CASCADE | SET NULL [ ( column_name [, ... ] ) ] | SET DEFAULT [ ( column_name [, ... ] ) ] } and like_option is: { INCLUDING | EXCLUDING } { COMMENTS | CONSTRAINTS | DEFAULTS | GENERATED | IDENTITY | INDEXES | STATISTICS | ALL } index_parameters in UNIQUE and PRIMARY KEY constraints are: [ INCLUDE ( column_name [, ... ] ) ]
Columnas de identidad
nota
Cuando se utilizan columnas de identidad, se debe considerar con cuidado el valor de la caché. Para obtener más información, consulte el aviso Importante de la página CREATE SEQUENCE.
Para obtener orientación sobre la mejor manera de utilizar las columnas de identidad en función de los patrones de carga de trabajo, consulte Trabajar con secuencias y columnas de identidad.
La cláusula GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY ( crea la columna como una columna de identidad. Tendrá una secuencia implícita asociada y, en las filas recién insertadas, la columna tendrá automáticamente los valores de la secuencia que se le haya asignado. Dicha columna es implícitamente sequence_options )NOT NULL.
Las cláusulas ALWAYS y BY DEFAULT determinan cómo se gestionan explícitamente los valores especificados por el usuario en los comandos INSERT y UPDATE.
En un comando INSERT, si se selecciona ALWAYS, solo se acepta un valor especificado por el usuario si la instrucción INSERT especifica OVERRIDING SYSTEM
VALUE. Si se selecciona BY DEFAULT, prevalece el valor especificado por el usuario.
En un comando UPDATE, si se selecciona ALWAYS, cualquier actualización de la columna a un valor distinto de DEFAULT se rechazará. Si se selecciona BY
DEFAULT, la columna se puede actualizar de forma normal. (No hay una cláusula OVERRIDING para el comando UPDATE).
La cláusula sequence_options se puede utilizar para anular los parámetros de la secuencia. Las opciones disponibles incluyen las que se muestran para CREATE SEQUENCE más SEQUENCE NAME
. Sin nameSEQUENCE NAME, el sistema elige un nombre no utilizado para la secuencia.
Modo de almacenamiento
La cláusula STORAGE opcional establece el modo de almacenamiento de la columna. Utilice estas opciones para controlar el comportamiento de la compresión para tipos de datos de longitud variable, como JSON, JSONB, TEXT, VARCHAR y BPCHAR.
Amazon Aurora DSQL comprime algunos tipos de datos cuando superan un tamaño determinado. Para deshabilitar este comportamiento, utilice las opciones PLAIN o EXTERNAL.
PLAIN-
Aurora DSQL almacena los datos en línea sin compresión. Esta es la única opción para tipos de datos de longitud fija, como
integer. Use esta opción para deshabilitar la compresión en algunos tipos de longitud variable. MAIN|EXTENDED|DEFAULT-
MAINyEXTENDEDpermiten la compresión opcional de la columna si el tipo de datos subyacente admite la compresión.DEFAULTestablece el modo de almacenamiento en el modo predeterminado para el tipo de datos de la columna. EXTERNAL-
Aurora DSQL no admite actualmente las tablas TOAST, pero
EXTERNALdesactiva la compresión en los tipos de datos que admiten la compresión.
Restricciones de clave externa
Las cláusulas REFERENCES y FOREIGN KEY especifican una restricción de clave externa, que indica que un grupo de una o más columnas de la nueva tabla debe contener solo valores que coincidan con los valores en la columna o columnas referenciadas de alguna fila de la tabla referenciada. Si omite la lista de refcolumn, Aurora DSQL utiliza la clave principal de reftable. De lo contrario, la lista de refcolumn debe hacer referencia a las columnas de una restricción de clave principal o única no aplazable.
Aurora DSQL compara un valor insertado en las columnas de referencia con los valores de la tabla a la que se hace referencia y las columnas a las que se hace referencia mediante el tipo de coincidencia indicado. Se admiten dos tipos de coincidencia: MATCH FULL y MATCH SIMPLE (que es el predeterminado).
Puede definir una clave externa como una restricción de columna o una restricción de tabla:
-
Restricción de columna (REFERENCES): utilice
REFERENCESdespués del tipo de datos de la columna para las claves externas de una sola columna. -
Restricción de tabla (FOREIGN KEY): utilice
FOREIGN KEY (...) REFERENCES ...para claves externas de una o varias columnas.
Acciones de referencia
Al cambiar los datos de las columnas a las que se hace referencia, Aurora DSQL realiza acciones en los datos de las columnas de la tabla de referencia. La cláusula ON DELETE especifica la acción que se debe realizar cuando una transacción elimina una fila a la que se hace referencia en la tabla a la que se hace referencia. Del mismo modo, la cláusula ON UPDATE especifica la acción que se debe realizar cuando una transacción actualiza una columna a la que se hace referencia a un nuevo valor. Si una transacción actualiza la fila pero no cambia la columna a la que se hace referencia, Aurora DSQL no realiza ninguna acción.
Aurora DSQL admite las siguientes acciones de referencia:
NO ACTION(predeterminado)-
Produce un error si la eliminación o la actualización crearían una infracción de la restricción de clave externa. Si la restricción se aplaza, Aurora DSQL produce este error en el momento de comprobar la restricción si aún existe alguna fila de referencia. Esta es la acción predeterminada.
RESTRICT-
Se produce un error si una fila que se va a eliminar o actualizar coincide con una fila de la tabla de referencia. Esto impide la acción incluso si el estado posterior a la acción no infringe la restricción de clave externa. En particular, impide que las filas a las que se hace referencia se actualicen a valores distintos pero que se comparen como iguales. A diferencia de
NO ACTION, la comprobaciónRESTRICTno se puede aplazar.
Las acciones en cascada cuentan para los límites de modificación de las transacciones
Las acciones CASCADE, SET NULL y SET DEFAULT modifican automáticamente las filas de la tabla de referencia cuando se actualiza o elimina una fila referenciada. El límite de filas de transacciones de Aurora DSQL se aplica a estas acciones y puede provocar errores inesperados si no se utiliza con cuidado. Prefiera NO ACTION o RESTRICT para las relaciones con claves externas en las que la cardinalidad de las filas secundarias sea ilimitada o impredecible. Para obtener más información, consulte Límites de base de datos en Aurora DSQL.
CASCADE-
Elimine las filas que hagan referencia a la fila eliminada o actualice los valores de las columnas de referencia a los nuevos valores de las columnas a las que se hace referencia, respectivamente.
SET NULL [ ( column_name [, ... ] ) ]-
Establezca todas las columnas de referencia o un subconjunto específico de las columnas de referencia, en nulo. Solo se puede especificar un subconjunto de columnas para las acciones
ON DELETE. SET DEFAULT [ ( column_name [, ... ] ) ]-
Establezca todas las columnas de referencia o un subconjunto específico de las columnas de referencia, en sus valores predeterminados. Solo se puede especificar un subconjunto de columnas para las acciones
ON DELETE. (Debe haber una fila en la tabla a la que se hace referencia que coincida con los valores predeterminados, si no son nulos, o la operación producirá un error).
Tipos de coincidencia
Aurora DSQL admite los siguientes tipos de coincidencia:
MATCH SIMPLE(predeterminado)-
Permite que cualquiera de las columnas de clave externa sea nula. Si alguna de ellas es nula, no es necesario que la fila coincida con la tabla a la que se hace referencia.
MATCH FULL-
No permite que una columna de una clave externa de varias columnas sea nula a menos que todas las columnas de clave externa sean nulas. Si todas son nulas, no es necesario que la fila coincida con la tabla a la que se hace referencia.
Puede aplicar restricciones NOT NULL a las columnas de referencia para evitar que se produzcan estos casos.
Aplazabilidad
Puede controlar cuándo se comprueba una restricción de clave externa especificando su aplazabilidad:
NOT DEFERRABLE(predeterminado)-
Aurora DSQL comprueba esta restricción inmediatamente después de cada instrucción. No puede cambiarla a aplazada con
SET CONSTRAINTS. DEFERRABLE-
La restricción se puede aplazar hasta el final de la transacción mediante
SET CONSTRAINTS. Sin una cláusulaINITIALLY, el valor predeterminado esINITIALLY IMMEDIATE. DEFERRABLE INITIALLY IMMEDIATE-
De forma predeterminada, Aurora DSQL comprueba esta restricción después de cada instrucción, pero puede aplazarla dentro de una transacción mediante
SET CONSTRAINTS ... DEFERRED. DEFERRABLE INITIALLY DEFERRED-
De forma predeterminada, Aurora DSQL comprueba esta restricción en el momento de confirmar la transacción. Puede cambiarla a inmediata dentro de una transacción mediante
SET CONSTRAINTS ... IMMEDIATE.
Para obtener más información sobre cómo cambiar el tiempo de verificación de restricciones dentro de una transacción, consulte SET CONSTRAINTS.
Solo restricciones de clave externa
En Aurora DSQL, la opción DEFERRABLE se aplica solo a las restricciones de clave externa.
Ejemplos de restricciones de clave externa
Suponga que tiene una tabla que almacena productos:
CREATE TABLE products ( product_no integer PRIMARY KEY, name text, price numeric );
Ahora quiere una tabla que almacene los pedidos de esos productos. Desea asegurarse de que la tabla de pedidos contenga referencias a productos que realmente existen. Defina una restricción de clave externa en la tabla de pedidos que haga referencia a la tabla de productos:
CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer REFERENCES products (product_no), quantity integer );
Ahora no puede crear pedidos con entradas product_no no NULL que no aparezcan en la tabla de productos.
En esta situación, la tabla de pedidos es la tabla de referencia y la tabla de productos es la tabla referenciada. Del mismo modo, hay columnas de referencia y columnas referenciadas.
Puede acortar el comando anterior a:
CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer REFERENCES products, quantity integer );
Si omite la lista de columnas, Aurora DSQL utiliza la clave principal de tabla a la que se hace referencia como las columnas referenciadas.
Puede asignar su propio nombre a una restricción de clave externa de la forma habitual:
CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer CONSTRAINT fk_product REFERENCES products, quantity integer );
Una clave externa también puede restringir y hacer referencia a un grupo de columnas. Luego, debe escribirse en un formulario de restricción de tabla:
CREATE TABLE inventory ( warehouse_id integer, product_no integer, quantity integer, PRIMARY KEY (warehouse_id, product_no) ); CREATE TABLE shipments ( shipment_id integer PRIMARY KEY, warehouse_id integer, product_no integer, FOREIGN KEY (warehouse_id, product_no) REFERENCES inventory (warehouse_id, product_no) );
El número y los tipos de las columnas restringidas deben ser compatibles con el número y los tipos de las columnas a las que se hace referencia.
Una tabla puede tener más de una restricción de clave externa. Esto se usa para implementar las relaciones de varios a varios entre las tablas:
CREATE TABLE order_items ( product_no integer REFERENCES products, order_id integer REFERENCES orders, quantity integer, PRIMARY KEY (product_no, order_id) );
Una restricción de clave externa puede hacer referencia a la misma tabla a la que pertenece. Esto se llama clave externa autorreferencial. Por ejemplo, si desea que las filas de una tabla representen los nodos de una estructura de árbol, puede escribir:
CREATE TABLE tree ( node_id integer PRIMARY KEY, parent_id integer REFERENCES tree, name text );
Un nodo de nivel superior tendría un valor NULL parent_id, mientras que las entradas parent_id que no sean NULL están restringidas a hacer referencia a filas válidas de la tabla.
Puede especificar acciones referenciales para controlar lo que ocurre cuando se elimina o actualiza una fila referenciada. En el ejemplo siguiente, se usa ON DELETE RESTRICT para evitar que se elimine un producto al que todavía hace referencia un pedido:
CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer REFERENCES products ON DELETE RESTRICT, quantity integer );
Con RESTRICT, si se intenta eliminar un producto cuyos pedidos le hacen referencia, se produce un error inmediato. Con el valor predeterminado NO ACTION, la comprobación se puede aplazar hasta el final de la transacción si la restricción se declara DEFERRABLE.
Para crear una clave externa que pueda aplazarse hasta el final de una transacción, utilice la opción DEFERRABLE. Esto resulta útil cuando necesita insertar filas en ambas tablas dentro de la misma transacción, independientemente del orden:
CREATE TABLE orders ( order_id integer PRIMARY KEY, product_no integer REFERENCES products DEFERRABLE INITIALLY DEFERRED, quantity integer );
Con DEFERRABLE INITIALLY DEFERRED, la restricción no se comprueba hasta el momento de la confirmación. Puede insertar la fila de pedidos antes de que exista la fila de productos, siempre que la fila de productos esté presente cuando se confirme la transacción.
Para usar MATCH FULL con una clave externa compuesta, que requiere que todas las columnas de referencia sean nulas juntas o todas no nulas juntas:
CREATE TABLE shipments ( shipment_id integer PRIMARY KEY, warehouse_id integer, product_no integer, FOREIGN KEY (warehouse_id, product_no) REFERENCES inventory (warehouse_id, product_no) MATCH FULL );