CREATE TABLE AS — define una nueva tabla a partir de los resultados de una consulta
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 ]
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.
GLOBAL o LOCALIgnorado por compatibilidad. El uso de estas palabras clave está obsoleto; consulta CREATE TABLE para obtener detalles.
TEMPORARY o TEMPSi se especifica, la tabla se crea como una tabla temporal. Consulta CREATE TABLE para obtener detalles.
UNLOGGEDSi se especifica, la tabla se crea como una tabla no registrada (unlogged). Consulta CREATE TABLE para obtener detalles.
IF NOT EXISTSNo arroja un error si ya existe una relación con el mismo nombre; simplemente emite una advertencia y deja la tabla sin modificar.
nombre_tablaEl nombre (opcionalmente calificado por esquema) de la tabla a crear.
nombre_columnaEl 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 ROWSNo 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).
DROPLa 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 ] DATAEsta 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.
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.
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');
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.