Las tablas de AnalyticDB for PostgreSQL funcionan de manera similar a las de las bases de datos relacionales, con una diferencia clave: las filas se distribuyen entre los nodos de cómputo. La directiva de distribución de cada tabla determina cómo se dispersan dichas filas.
Creación de una tabla estándar
Use CREATE TABLE para definir una tabla. Al crearla, especifique:
Nombres de columna y sus data types
Restricciones
Sintaxis:
CREATE TABLE table_name (
[ { column_name data_type [ DEFAULT default_expr ] -- Column definition
[column_constraint [ ... ]] -- Column-level constraint
]
| table_constraint -- Table-level constraint
])
[ WITH ( storage_parameter=value [, ... ] ) ] -- Storage model
[ DISTRIBUTED BY (column, [ ... ] ) | DISTRIBUTED RANDOMLY ] -- Distribution key
[ partition clause] -- Partitioning strategy
Ejemplo:
El ejemplo a continuación crea una tabla sales con trans_id como clave de distribución y particionamiento por rango basado en fechas.
CREATE TABLE sales (
trans_id int,
date date,
amount decimal(9,2),
region text)
DISTRIBUTED BY (trans_id)
PARTITION BY RANGE(date)
(start (date '2018-01-01') inclusive
end (date '2019-01-01') exclusive every (interval '1 month'),
default partition outlying_dates);
Creación de una tabla temporal
Las tablas temporales almacenan datos intermedios durante la duración de una sesión o transacción. De forma predeterminada, una tabla temporal se elimina automáticamente al finalizar la sesión.
Sintaxis:
CREATE TEMPORARY TABLE table_name(...)
[ON COMMIT {PRESERVE ROWS | DELETE ROWS | DROP}]
Use la cláusula ON COMMIT para controlar qué sucede con la tabla al final de la transacción actual:
|
Opción |
Comportamiento |
|
|
Conserva todas las filas. Esta es la opción predeterminada. |
|
|
Elimina todas las filas, pero conserva la estructura de la tabla. |
|
|
Elimina la tabla por completo. |
Ejemplo:
CREATE TEMPORARY TABLE temp_foo (a int, b text) ON COMMIT DROP;
Definición de restricciones
Las restricciones limitan los datos que se pueden almacenar en una tabla, ya sea en la columna o en la tabla.
Antes de definir restricciones, considere las siguientes reglas:
Las restricciones
CHECKsolo pueden hacer referencia a columnas de la tabla donde se definen.Las restricciones
UNIQUEyPRIMARY KEYdeben incluir la clave de distribución. Estas restricciones no se permiten en tablas optimizadas para anexión (AO) ni en tablas orientadas a columnas.Las restricciones
FOREIGN KEYse permiten, pero no se aplican de forma obligatoria.Las restricciones definidas en una partición se aplican a todas las demás particiones. No es posible limitar el alcance de las restricciones a particiones individuales.
Sintaxis:
UNIQUE ( column_name [, ... ] )
| PRIMARY KEY ( column_name [, ... ] )
| CHECK ( expression )
| FOREIGN KEY ( column_name [, ... ] )
REFERENCES table_name [ ( column_name [, ... ] ) ]
[ key_match_type ]
[ key_action ]
[ key_checking_mode ]
Restricciones CHECK
Una restricción CHECK exige que los valores de la columna cumplan con una expresión booleana.
CREATE TABLE products (
product_no integer,
name text,
price numeric CHECK (price > 0)
);
Restricciones NOT NULL
Una restricción NOT NULL impide que una columna contenga valores NULL.
CREATE TABLE products (
product_no integer NOT NULL,
name text NOT NULL,
price numeric
);
Restricciones UNIQUE
Una restricción UNIQUE garantiza que los valores de una columna o grupo de columnas sean únicos en todas las filas. La tabla debe tener distribución hash y las columnas de la restricción deben incluir la clave de distribución.
CREATE TABLE products (
product_no integer UNIQUE,
name text,
price numeric)
DISTRIBUTED BY (product_no);
Restricciones PRIMARY KEY
Una restricción PRIMARY KEY combina una restricción UNIQUE y una restricción NOT NULL. La tabla debe tener distribución hash y las columnas de la restricción deben incluir la clave de distribución.
Si una tabla tiene una clave primaria, la columna o columnas correspondientes se usan como clave de distribución de forma predeterminada.
CREATE TABLE products (
product_no integer PRIMARY KEY,
name text,
price numeric)
DISTRIBUTED BY (product_no);