CREATE FOREIGN TABLE

CREATE FOREIGN TABLE — definir una nueva tabla foránea

Synopsis

CREATE FOREIGN TABLE [ IF NOT EXISTS ] nombre_tabla ( [
  { nombre_columna tipo_datos [ OPTIONS ( opción 'valor' [, ... ] ) ] [ COLLATE colación ] [ restricción_columna [ ... ] ]
    | restricción_tabla
    | LIKE tabla_origen [ opción_like ... ] }
    [, ... ]
] )
[ INHERITS ( tabla_padre [, ... ] ) ]
  SERVER nombre_servidor
[ OPTIONS ( opción 'valor' [, ... ] ) ]

CREATE FOREIGN TABLE [ IF NOT EXISTS ] nombre_tabla
  PARTITION OF tabla_padre [ (
  { nombre_columna [ WITH OPTIONS ] [ restricción_columna [ ... ] ]
    | restricción_tabla }
    [, ... ]
) ]
{ FOR VALUES especificación_límite_partición | DEFAULT }
  SERVER nombre_servidor
[ OPTIONS ( opción 'valor' [, ... ] ) ]

donde restricción_columna es:

[ CONSTRAINT nombre_restricción ]
{ NOT NULL [ NO INHERIT ] |
  NULL |
  CHECK ( expresión ) [ NO INHERIT ] |
  DEFAULT expresión_por_defecto |
  GENERATED ALWAYS AS ( expresión_generación ) [ STORED | VIRTUAL ] }
[ ENFORCED | NOT ENFORCED ]

y restricción_tabla es:

[ CONSTRAINT nombre_restricción ]
{  NOT NULL nombre_columna [ NO INHERIT ] |
   CHECK ( expresión ) [ NO INHERIT ] }
[ ENFORCED | NOT ENFORCED ]

y opción_like es:

{ INCLUDING | EXCLUDING } { COMMENTS | CONSTRAINTS | DEFAULTS | GENERATED | STATISTICS | ALL }

y especificación_límite_partición es:

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 ( MODULUS literal_numérico, REMAINDER literal_numérico )

Descripción

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.

Parámetros

IF NOT EXISTS

No 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_tabla

El nombre (opcionalmente calificado por esquema) de la tabla que se va a crear.

nombre_columna

El nombre de una columna que se va a crear en la nueva tabla.

tipo_datos

El 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 COMMENTS

Se 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 GENERATED

Se copiará cualquier expresión de generación de las definiciones de columnas copiadas. Por defecto, las nuevas columnas serán columnas base regulares.

INCLUDING STATISTICS

Las 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.

NULL

La 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_servidor

El 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).

Notas

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.

Caution

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.

Ejemplos

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;

Compatibilidad

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.

Consulte también

ALTER FOREIGN TABLE, DROP FOREIGN TABLE, CREATE TABLE, CREATE SERVER, IMPORT FOREIGN SCHEMA