CREATE FOREIGN TABLE — definir una nueva tabla foránea
CREATE FOREIGN TABLE [ IF NOT EXISTS ]nombre_tabla( [ {nombre_columnatipo_datos[ OPTIONS (opción'valor' [, ... ] ) ] [ COLLATEcolación] [restricción_columna[ ... ] ] |restricción_tabla| LIKEtabla_origen[opción_like... ] } [, ... ] ] ) [ INHERITS (tabla_padre[, ... ] ) ] SERVERnombre_servidor[ OPTIONS (opción'valor' [, ... ] ) ] CREATE FOREIGN TABLE [ IF NOT EXISTS ]nombre_tablaPARTITION OFtabla_padre[ ( {nombre_columna[ WITH OPTIONS ] [restricción_columna[ ... ] ] |restricción_tabla} [, ... ] ) ] { FOR VALUESespecificación_límite_partición| DEFAULT } SERVERnombre_servidor[ OPTIONS (opción'valor' [, ... ] ) ] donderestricción_columnaes: [ CONSTRAINTnombre_restricción] { NOT NULL [ NO INHERIT ] | NULL | CHECK (expresión) [ NO INHERIT ] | DEFAULTexpresión_por_defecto| GENERATED ALWAYS AS (expresión_generación) [ STORED | VIRTUAL ] } [ ENFORCED | NOT ENFORCED ] yrestricción_tablaes: [ CONSTRAINTnombre_restricción] { NOT NULLnombre_columna[ NO INHERIT ] | CHECK (expresión) [ NO INHERIT ] } [ ENFORCED | NOT ENFORCED ] yopción_likees: { INCLUDING | EXCLUDING } { COMMENTS | CONSTRAINTS | DEFAULTS | GENERATED | STATISTICS | ALL } yespecificación_límite_particiónes: IN (expresión_límite_partición[, ...] ) | FROM ( {expresión_límite_partición| MINVALUE | MAXVALUE } [, ...] ) TO ( {expresión_límite_partición| MINVALUE | MAXVALUE } [, ...] ) | WITH ( MODULUSliteral_numérico, REMAINDERliteral_numérico)
CREATE FOREIGN TABLE crea una nueva tabla foránea
en la base de datos actual. El usuario que ejecuta el comando se convierte en
el propietario de la tabla.
Si se proporciona un nombre de esquema (por ejemplo, CREATE FOREIGN TABLE
mi_esquema.mi_tabla ...), la tabla se crea en el esquema especificado.
De lo contrario, se crea en el esquema actual. El nombre de la tabla foránea debe ser
distinto del nombre de cualquier otra relación (tabla, secuencia, índice, vista,
vista materializada o tabla foránea) en el mismo esquema.
CREATE FOREIGN TABLE también crea automáticamente un tipo de
datos que representa el tipo compuesto correspondiente a una fila de la tabla foránea.
Por lo tanto, las tablas foráneas no pueden tener el mismo nombre que cualquier tipo
de datos existente en el mismo esquema.
Si se especifica la cláusula PARTITION OF, la tabla se crea
como una partición de tabla_padre con los límites especificados.
Para poder crear una tabla foránea, debes tener el privilegio USAGE
en el servidor foráneo, así como el privilegio USAGE en todos los
tipos de columnas utilizados en la tabla.
IF NOT EXISTSNo lances un error si ya existe una relación con el mismo nombre. En este caso se emitirá una advertencia. Ten en cuenta que no hay garantía de que la relación existente sea similar a la que se habría creado.
nombre_tablaEl nombre (opcionalmente calificado por esquema) de la tabla que se va a crear.
nombre_columnaEl nombre de una columna que se va a crear en la nueva tabla.
tipo_datosEl tipo de datos de la columna. Puede incluir especificadores de array. Para obtener más información sobre los tipos de datos admitidos por PostgreSQL, consulta la Chapter 8.
COLLATE colación
La cláusula COLLATE asigna una colación (ordenación) a la
columna (que debe ser de un tipo de datos ordenable). Si no se especifica, se
utiliza la colación predeterminada del tipo de datos de la columna.
INHERITS ( tabla_padre [, ... ] )
La cláusula opcional INHERITS especifica una lista de tablas
de las cuales la nueva tabla foránea hereda automáticamente todas las columnas.
Las tablas padres pueden ser tablas comunes o tablas foráneas. Consulta la forma
similar de CREATE TABLE
para más detalles.
PARTITION OF tabla_padre { FOR VALUES especificación_límite_partición | DEFAULT }
Esta forma se puede utilizar para crear la tabla foránea como una partición de la
tabla padre dada con los valores de límite de partición especificados. Consulta la
forma similar de CREATE TABLE
para más detalles. Ten en cuenta que actualmente no se permite crear la tabla foránea
como una partición de la tabla padre si existen índices UNIQUE en la
tabla padre (consulta también ALTER TABLE ATTACH PARTITION).
LIKE tabla_origen [ opción_like ... ]
La cláusula LIKE especifica una tabla de la cual la nueva tabla
copia automáticamente todos los nombres de columnas, sus tipos de datos y sus
restricciones de no nulo.
A diferencia de INHERITS, la nueva tabla y la tabla original quedan
completamente desacopladas una vez finalizada la creación. Los cambios en la tabla original
no se aplicarán a la nueva tabla, y no es posible incluir datos de la nueva tabla en los
escaneos de la tabla original.
También a diferencia de INHERITS, las columnas y restricciones copiadas
por LIKE no se fusionan con columnas y restricciones del mismo nombre.
Si el mismo nombre se especifica explícitamente o en otra cláusula LIKE,
se reportará un error.
Las cláusulas opcionales opción_like especifican qué propiedades
adicionales de la tabla original se deben copiar. Especificar INCLUDING
copia la propiedad, mientras que EXCLUDING la omite. La opción por defecto
es EXCLUDING. Si se realizan múltiples especificaciones para el mismo tipo
de objeto, se utiliza la última. Las opciones disponibles son:
INCLUDING COMMENTSSe copiarán los comentarios de las columnas copiadas, las restricciones y las estadísticas extendidas. El comportamiento predeterminado es excluir los comentarios, lo que resulta en que los objetos correspondientes en la nueva tabla no tengan comentarios.
INCLUDING CONSTRAINTS
Se copiarán las restricciones CHECK. No se hace distinción entre
restricciones de columna y restricciones de tabla. Las restricciones de no nulo siempre
se copian a la nueva tabla.
INCLUDING DEFAULTS
Se copiarán las expresiones por defecto para las definiciones de columna copiadas. De lo
contrario, las expresiones por defecto no se copian, lo que resulta en que las columnas
copiadas en la nueva tabla tengan valores por defecto nulos. Ten en cuenta que copiar
valores por defecto que llaman a funciones de modificación de la base de datos, como
nextval, puede crear un vínculo funcional entre la tabla original y
la nueva.
INCLUDING GENERATEDSe copiará cualquier expresión de generación de las definiciones de columnas copiadas. Por defecto, las nuevas columnas serán columnas base regulares.
INCLUDING STATISTICSLas estadísticas extendidas se copian a la nueva tabla.
INCLUDING ALL
INCLUDING ALL es una forma abreviada para seleccionar todas las
opciones individuales disponibles. (Puede resultar útil escribir cláusulas
EXCLUDING individuales después de INCLUDING ALL
para seleccionar todas las opciones excepto algunas específicas).
CONSTRAINT nombre_restricción
Un nombre opcional para una restricción de columna o tabla. Si se viola la restricción,
el nombre de la restricción aparece en los mensajes de error, por lo que nombres de restricción
como la_columna_debe_ser_positiva se pueden usar para comunicar información
de restricción útil a las aplicaciones cliente. (Se necesitan comillas dobles para especificar
nombres de restricciones que contengan espacios). Si no se especifica un nombre de restricción,
el sistema genera uno.
NOT NULL [ NO INHERIT ]La columna no puede contener valores nulos.
Una restricción marcada con NO INHERIT no se propagará a las tablas hijas.
NULLLa columna puede contener valores nulos. Este es el comportamiento predeterminado.
Esta cláusula solo se proporciona para compatibilidad con bases de datos SQL no estándar. Se desaconseja su uso en aplicaciones nuevas.
CHECK ( expresión ) [ NO INHERIT ]
La cláusula CHECK especifica una expresión que produce un resultado booleano
que se espera que cumpla cada fila de la tabla foránea; es decir, la expresión debe producir
TRUE o UNKNOWN, nunca FALSE, para todas las filas de la tabla foránea. Una restricción check
especificada como restricción de columna solo debe hacer referencia al valor de esa columna,
mientras que una expresión que aparece en una restricción de tabla puede hacer referencia a múltiples columnas.
Actualmente, las expresiones CHECK no pueden contener subconsultas ni hacer
referencia a variables que no sean columnas de la fila actual. Se puede hacer referencia a la
columna del sistema tableoid, pero no a ninguna otra columna del sistema.
Una restricción marcada con NO INHERIT no se propagará a las tablas hijas.
DEFAULT expresión_por_defecto
La cláusula DEFAULT asigna un valor de datos por defecto para la columna
en cuya definición aparece. El valor es cualquier expresión libre de variables (no se permiten
subconsultas ni referencias cruzadas a otras columnas de la tabla actual). El tipo de datos
de la expresión por defecto debe coincidir con el tipo de datos de la columna.
La expresión por defecto se utilizará en cualquier operación de inserción que no especifique un valor para la columna. Si no hay un valor por defecto para una columna, entonces el valor por defecto es nulo.
GENERATED ALWAYS AS ( expresión_generación ) [ STORED | VIRTUAL ]Esta cláusula crea la columna como una columna generada. La columna no se puede escribir directamente, y al leerla se devolverá el resultado de la expresión especificada.
Cuando se especifica VIRTUAL, la columna se calculará al leerla. (El envolvedor
de datos foráneos la verá como un valor nulo en las filas nuevas y puede optar por almacenarla como
un valor nulo o ignorarla por completo). Cuando se especifica STORED, la columna
se calculará al escribir. (El valor calculado se presentará al envolvedor de datos foráneos para su
almacenamiento y debe devolverse al leer). VIRTUAL es la opción predeterminada.
La expresión de generación puede hacer referencia a otras columnas de la tabla, pero no a otras columnas generadas. Cualquier función y operador utilizado debe ser inmutable. No se permiten referencias a otras tablas.
nombre_servidorEl nombre de un servidor foráneo existente que se utilizará para la tabla foránea. Para obtener detalles sobre cómo definir un servidor, consulta la CREATE SERVER.
OPTIONS ( opción 'valor' [, ...] )Opciones que se asociarán con la nueva tabla foránea o una de sus columnas. Los nombres y valores de opciones permitidos son específicos de cada envolvedor de datos foráneos y se validan mediante la función validadora del mismo. No se permiten nombres de opciones duplicados (aunque está bien que una opción de tabla y una opción de columna tengan el mismo nombre).
El sistema central de PostgreSQL no hace cumplir las restricciones en
las tablas foráneas (como las cláusulas CHECK o NOT NULL), y la
mayoría de los envolvedores de datos foráneos tampoco intentan hacerlas cumplir; es decir, simplemente
se asume que la restricción se cumple. Tendría poco sentido tal cumplimiento ya que solo se aplicaría
a las filas insertadas o actualizadas a través de la tabla foránea, y no a las filas modificadas por
otros medios, como directamente en el servidor remoto. En su lugar, una restricción adjunta a una
tabla foránea debe representar una restricción que está siendo aplicada por el servidor remoto.
Algunos envolvedores de datos foráneos para propósitos especiales podrían ser el único mecanismo de acceso para los datos a los que acceden, y en ese caso podría ser apropiado que el propio envolvedor de datos foráneos realice el cumplimiento de las restricciones. Pero no debes asumir que un envolvedor hace eso a menos que su documentación lo indique.
Aunque PostgreSQL no intenta hacer cumplir las restricciones en las tablas foráneas, sí asume que son correctas para fines de optimización de consultas. Si hay filas visibles en la tabla foránea que no cumplen con una restricción declarada, las consultas en la tabla podrían producir errores o respuestas incorrectas. Es responsabilidad del usuario asegurarse de que la definición de la restricción coincida con la realidad.
Cuando se utiliza una tabla foránea como partición de una tabla particionada, existe la restricción implícita de que sus contenidos deben cumplir con la regla de particionamiento. Una vez más, es responsabilidad del usuario asegurarse de que eso sea cierto, lo cual se hace mejor instalando una restricción coincidente en el servidor remoto.
Dentro de una tabla particionada que contiene particiones de tablas foráneas, un UPDATE
que cambie el valor de la clave de partición puede hacer que una fila se mueva de una partición local
a una partición de tabla foránea, siempre que el envolvedor de datos foráneos admita el enrutamiento de
tuplas. Sin embargo, actualmente no es posible mover una fila de una partición de tabla foránea a otra
partición. Un UPDATE que requiera hacer eso fallará debido a la restricción de
particionamiento, asumiendo que el servidor remoto la hace cumplir adecuadamente.
Se aplican consideraciones similares a las columnas generadas. Las columnas generadas almacenadas (stored) se calculan en la inserción o actualización en el servidor local de PostgreSQL y se entregan al envolvedor de datos foráneos para su escritura en el almacén de datos foráneo, pero no se garantiza que una consulta de la tabla foránea devuelva valores para las columnas generadas almacenadas que sean consistientes con la expresión de generación. Una vez más, esto podría dar como resultado resultados de consulta incorrectos.
Crea la tabla foránea films, a la cual se accederá a través
del servidor film_server:
CREATE FOREIGN TABLE films (
code char(5) NOT NULL,
title varchar(40) NOT NULL,
did integer NOT NULL,
date_prod date,
kind varchar(10),
len interval hour to minute
)
SERVER film_server;
Crea la tabla foránea measurement_y2016m07, a la cual se
accederá a través del servidor server_07, como una partición
de la tabla particionada por rango measurement:
CREATE FOREIGN TABLE measurement_y2016m07
PARTITION OF measurement FOR VALUES FROM ('2016-07-01') TO ('2016-08-01')
SERVER server_07;
El comando CREATE FOREIGN TABLE cumple en gran medida con el estándar
SQL; sin embargo, al igual que con CREATE TABLE,
se permiten restricciones NULL y tablas foráneas de cero columnas.
La capacidad de especificar valores por defecto para las columnas también es una extensión de
PostgreSQL. La herencia de tablas, en la forma definida por
PostgreSQL, no es estándar. La cláusula LIKE, tal como se
admite en este comando, no es estándar.