CREATE TABLE AS

CREATE TABLE AS — define una nueva tabla a partir de los resultados de una consulta

Synopsis

CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] nombre_tabla
    [ (nombre_columna [, ...] ) ]
    [ USING método ]
    [ WITH ( parámetro_almacenamiento [= valor] [, ... ] ) | WITHOUT OIDS ]
    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
    [ TABLESPACE nombre_tablespace ]
    AS consulta
    [ WITH [ NO ] DATA ]

Descripción

CREATE TABLE AS crea una tabla y la llena con datos calculados por un comando SELECT. Las columnas de la tabla tienen los nombres y tipos de datos asociados con las columnas de salida del SELECT (excepto que puedes anular los nombres de las columnas dando una lista explícita de nuevos nombres de columna).

CREATE TABLE AS tiene cierta semejanza con la creación de una vista, pero en realidad es bastante diferente: crea una nueva tabla y evalúa la consulta una sola vez para llenar la nueva tabla inicialmente. La nueva tabla no hará un seguimiento de los cambios posteriores en las tablas de origen de la consulta. Por el contrario, una vista vuelve a evaluar su sentencia SELECT definitoria cada vez que se consulta.

CREATE TABLE AS requiere el privilegio CREATE en el esquema utilizado para la tabla.

Parámetros

GLOBAL o LOCAL

Ignorado por compatibilidad. El uso de estas palabras clave está obsoleto; consulta CREATE TABLE para obtener detalles.

TEMPORARY o TEMP

Si se especifica, la tabla se crea como una tabla temporal. Consulta CREATE TABLE para obtener detalles.

UNLOGGED

Si se especifica, la tabla se crea como una tabla no registrada (unlogged). Consulta CREATE TABLE para obtener detalles.

IF NOT EXISTS

No arroja un error si ya existe una relación con el mismo nombre; simplemente emite una advertencia y deja la tabla sin modificar.

nombre_tabla

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

nombre_columna

El nombre de una columna en la nueva tabla. Si no se proporcionan los nombres de las columnas, se toman de los nombres de las columnas de salida de la consulta.

USING método

Esta cláusula opcional especifica el método de acceso a la tabla que se utilizará para almacenar los contenidos de la nueva tabla; el método debe ser un método de acceso de tipo TABLE. Consulta Chapter 62 para obtener más información. Si no se especifica esta opción, se elige el método de acceso a la tabla por defecto para la nueva tabla. Consulta default_table_access_method para obtener más información.

WITH ( parámetro_almacenamiento [= valor] [, ... ] )

Esta cláusula especifica parámetros de almacenamiento opcionales para la nueva tabla; consulta Parámetros de almacenamiento en la documentación de CREATE TABLE para obtener más información. Para compatibilidad con versiones anteriores, la cláusula WITH para una tabla también puede incluir OIDS=FALSE para especificar que las filas de la nueva tabla no deben contener OID (identificadores de objeto), OIDS=TRUE ya no está soportado.

WITHOUT OIDS

Esta es una sintaxis compatible con versiones anteriores para declarar una tabla WITHOUT OIDS, ya no está soportado crear una tabla WITH OIDS.

ON COMMIT

El comportamiento de las tablas temporales al final de un bloque de transacción se puede controlar utilizando ON COMMIT. Las tres opciones son:

PRESERVE ROWS

No se realiza ninguna acción especial al final de las transacciones. Este es el comportamiento por defecto.

DELETE ROWS

Todas las filas en la tabla temporal se eliminarán al final de cada bloque de transacción. Básicamente, se realiza un TRUNCATE automático en cada confirmación (commit).

DROP

La tabla temporal se eliminará (drop) al final del bloque de transacción actual.

TABLESPACE nombre_tablespace

El nombre_tablespace es el nombre del tablespace en el que se va a crear la nueva tabla. Si no se especifica, se consulta default_tablespace, o temp_tablespaces si la tabla es temporal.

consulta

Un comando SELECT, TABLE o VALUES, o un comando EXECUTE que ejecuta una consulta preparada de tipo SELECT, TABLE o VALUES.

WITH [ NO ] DATA

Esta cláusula especifica si los datos producidos por la consulta deben copiarse o no en la nueva tabla. Si no, solo se copia la estructura de la tabla. El valor por defecto es copiar los datos.

Notas

Este comando es funcionalmente similar a SELECT INTO, pero es preferible ya que es menos probable que se confunda con otros usos de la sintaxis SELECT INTO. Además, CREATE TABLE AS ofrece un superconjunto de la funcionalidad que ofrece SELECT INTO.

Ejemplos

Crea una nueva tabla films_recent que consiste únicamente en las entradas recientes de la tabla films:

CREATE TABLE films_recent AS
  SELECT * FROM films WHERE date_prod >= '2002-01-01';

Para copiar una tabla por completo, también se puede usar la forma corta que utiliza el comando TABLE:

CREATE TABLE films2 AS
  TABLE films;

Crea una nueva tabla temporal films_recent, que consiste únicamente en las entradas recientes de la tabla films, utilizando una sentencia preparada. La nueva tabla se eliminará al confirmar la transacción:

PREPARE recentfilms(date) AS
  SELECT * FROM films WHERE date_prod > $1;
CREATE TEMP TABLE films_recent ON COMMIT DROP AS
  EXECUTE recentfilms('2002-01-01');

Compatibilidad

CREATE TABLE AS cumple con el estándar SQL. Las siguientes son extensiones no estándar:

  • El estándar requiere paréntesis alrededor de la cláusula de subconsulta; en PostgreSQL, estos paréntesis son opcionales.

  • En el estándar, la cláusula WITH [ NO ] DATA es obligatoria; en PostgreSQL es opcional.

  • PostgreSQL maneja las tablas temporales de una manera bastante diferente a la del estándar; consulta CREATE TABLE para obtener detalles.

  • La cláusula WITH es una extensión de PostgreSQL; los parámetros de almacenamiento no están en el estándar.

  • El concepto de tablespaces de PostgreSQL no forma parte del estándar. Por lo tanto, la cláusula TABLESPACE es una extensión.

Consulte también

CREATE MATERIALIZED VIEW, CREATE TABLE, EXECUTE, SELECT, SELECT INTO, VALUES