CREATE TABLE AS
CREATE TABLE AS — Définir une nouvelle table à partir des
résultats d'une requête
Synopsis
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE nom_table
[ (nom_colonne [, ...] ) ]
[ WITH ( parametre_stockage [= valeur] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE espace_logique ]
AS requête
Description
CREATE TABLE AS
crée
une table et y insère les données récupérées par une commande
SELECT
. Les colonnes
de la table ont les noms et les types de données associés aux
colonnes en sortie du
SELECT
(les noms des colonnes
peuvent toutefois être surchargés).
CREATE TABLE AS
semble possèder des similitudes avec la création d'une vue mais
est, en fait, assez différente : elle crée une nouvelle table et
n'évalue la requête qu'une seule fois, pour le chargement initial
de la nouvelle table. Les modifications ultérieures de la table
source ne sont pas prises en compte. Au contraire, une vue réévalue
l'instruction
SELECT
de définition à chaque appel.
Paramètres
-
GLOBAL ou
LOCAL
-
Ignoré. Conservé pour la compatibilité (cf. CREATE
TABLE).
-
TEMPORARY ou
TEMP
-
Si spécifié, la table est temporaire (cf. CREATE
TABLE).
-
nom_table
-
Le nom de la table à créer (éventuellement qualifié du nom du
schéma).
-
nom_colonne
-
Le nom d'une colonne dans la nouvelle table. Si les noms de
colonnes ne sont pas précisés, ils sont issus des noms des
colonnes en sortie de la requête. Les noms des colonnes ne
peuvent pas être précisés lorsque la table est créée à partir
d'une commande
EXECUTE
.
-
WITH (
paramètre_stockage
[=
valeur
] [, ... ] )
-
Cette clause indique les paramètres de stockage optionnels
pour la nouvelle table ; voir Paramètres de stockage
pour plus d'informations. La clause WITH peut aussi inclure OIDS=TRUE (ou simplement OIDS) pour indiquer que les lignes de la
nouvelle table doivent avoir des OID (identifiants d'objets)
ou OIDS=FALSE pour indiquer le
contraire. Voir CREATE TABLE pour plus
d'informations.
-
WITH OIDS,
WITHOUT OIDS
-
Ce sont les syntaxes obsolètes mais équivalentes,
respectivement de WITH (OIDS) et
WITH (OIDS=FALSE). Si vous souhaitez
indiquer à la fois l'option OIDS et
les paramètres de stockage, vous devez utiliser la syntaxe
WITH ( ... ) ; voir ci-dessus.
-
ON COMMIT
-
Le comportement des tables temporaires à la fin d'un bloc de
transaction est contrôlable en utilisant ON COMMIT. Voici les trois options :
-
PRESERVE
ROWS
-
Aucune action spéciale n'est effectuée à la fin de la
transaction. C'est le comportement par défaut.
-
DELETE
ROWS
-
Toutes les lignes de la table temporaire seront
supprimées à la fin de chaque bloc de transaction.
Habituellement, un TRUNCATE
automatique est effectué à chaque COMMIT.
-
DROP
-
La table temporaire sera supprimée à la fin du bloc de
transaction en cours.
-
TABLESPACE
espace_logique
-
L'
espace_logique
est le
nom du tablespace dans lequel est créée la nouvelle table.
S'il n'est pas indiqué, default_tablespace
est utilisé. L'espace logique par défaut de la base est
utilisé si default_tablespace est
une chaîne vide.
-
requête
-
Une commande SELECT ou VALUES, voire une commande EXECUTE qui
exécute un
SELECT
préparé ou une
requête
VALUES
.
Notes
Cette commande est fonctionnellement équivalente à SELECT INTO.
Elle lui est cependant préférée car elle présente moins de risques
de confusion avec les autres utilisations de la syntaxe
SELECT INTO
. De plus,
CREATE TABLE AS
offre
plus de fonctionnalités que
SELECT
INTO
.
Avant PostgreSQL™ 8.0,
CREATE TABLE AS
incluait toujours les OIDs dans la table créée. À partir de
PostgresSQL™ 8.0, la
commande
CREATE TABLE
AS
autorise l'utilisateur à spécifier explicitement
la présence des OID. En l'absence de précision, la variable de
configuration default_with_oids
est utilisée. À partir de PostgreSQL™ 8.1, la valeur par défaut de
cette variable est « faux » ; le comportement par défaut n'est donc
pas identique à celui des versions précédant la 8.0. Il est
préférable que les applications qui nécessitent des OID dans la
table créée par
CREATE TABLE
AS
indiquent explicitement WITH
(OIDS) pour s'assurer du comportement souhaité.
Exemples
Créer une table films_recent contenant les
entrées récentes de la table films :
CREATE TABLE films_recent AS
SELECT * FROM films WHERE date_prod >= '2006-01-01';
Créer une nouvelle table temporaire films_recents consistant des seules entrées récentes
provenant de la table films en utilisant
une instruction préparée. La nouvelle table a des OID et sera
supprimée à la validation (COMMIT) :
PREPARE films_recents(date) AS
SELECT * FROM films WHERE date_prod > $1;
CREATE TEMP TABLE films_recents WITH (OIDS) ON COMMIT DROP AS
EXECUTE films_recents('2002-01-01');
Compatibilité
CREATE TABLE AS
est
conforme au standard SQL, avec
les exceptions suivantes :
-
Le standard requiert des parenthèses autour de la clause de
la sous-requête ; elles sont optionnelles dans PostgreSQL™.
-
Le standard définit une clause WITH [ NO
] DATA ; ceci n'est pas encore implémenté dans
PostgreSQL™. Le
comportement proposé par PostgreSQL™ est équivalent au cas
standard WITH DATA. WITH NO DATA peut être simulé en ajoutant
LIMIT 0 à la requête.
-
PostgreSQL™ gère les
tables temporaires d'une façon bien différente de celle du
standard ; voir CREATE TABLE pour les détails.
-
La clause WITH est une extension
PostgreSQL™ ; ni les
paramètres de stockage ni les OID ne sont dans le standard.
-
Le concept PostgreSQL™
des tablespaces ne fait pas partie du standard. Du coup, la
clause TABLESPACE est une extension.