PostgreSQL prend en charge CREATE TABLE AS
et SELECT INTO
quand dois-je utiliser les deux?
CREATE TABLE AS
- définir une nouvelle table à partir des résultats d'une requête
CREATE TABLE AS
crée une table et la remplit de données calculées par une commandeSELECT
. Les colonnes de la table ont les noms et les types de données associés aux colonnes de sortie deSELECT
(sauf que vous pouvez remplacer les noms de colonne en donnant une liste explicite de nouveaux noms de colonne).
CREATE TABLE AS
ressemble un peu à la création d'une vue, mais c'est vraiment très différent: il crée une nouvelle table et évalue la requête une seule fois pour remplir la nouvelle table initialement. La nouvelle table ne suivra pas les modifications ultérieures apportées aux tables source de la requête. En revanche, une vue réévalue sa définitionSELECT
instruction chaque fois qu'elle est interrogée.
Et alors.
SELECT INTO
- définir une nouvelle table à partir des résultats d'une requête
SELECT INTO
crée une nouvelle table et la remplit de données calculées par une requête. Les données ne sont pas renvoyées au client, comme c'est le cas avec unSELECT
normal. Les colonnes de la nouvelle table ont les noms et les types de données associés aux colonnes de sortie deSELECT
.
Sans l'explication, utilisez toujours CREATE TABLE AS
sans exception. Au bas de chaque sous [~ # ~] notes [~ # ~] ceci est effacé,
Notes pour SELECT INTO
,
CREATE TABLE AS
est fonctionnellement similaire àSELECT INTO
.CREATE TABLE AS
est la syntaxe recommandée, car cette forme deSELECT INTO
n'est pas disponible dans ECPG ou PL/pgSQL, car ils interprètent la clause INTO différemment. De plus,CREATE TABLE AS
offre un surensemble des fonctionnalités fournies parSELECT INTO
.
Notes pour CREATE TABLE AS
,
Cette commande est fonctionnellement similaire à
SELECT INTO
, mais il est préférable car il est moins susceptible d'être confondu avec d'autres utilisations duSELECT INTO
syntaxe. De plus,CREATE TABLE AS
offre un surensemble des fonctionnalités offertes parSELECT INTO
.
Également dans la section Compatibilité de la documentation de SELECT INTO
ça va encore plus loin,
La norme SQL utilise
SELECT INTO
pour représenter la sélection de valeurs dans des variables scalaires d'un programme Host, plutôt que de créer une nouvelle table. C'est en effet l'usage trouvé dans ECPG (voir chapitre 34) et PL/pgSQL (voir chapitre 41). L'utilisation PostgreSQL deSELECT INTO
pour représenter la création de table est historique. Il est préférable d'utiliserCREATE TABLE AS
à cet effet dans le nouveau code.
Donc nous avons,
SELECT INTO
fait d'autres choses dans des contextes uniquement disponibles dans PL/pgSQL et ECPG.CREATE TABLE
prend en charge plus de fonctionnalités (je suppose qu'elles font référence à WITH OIDS
et TABLESPACE
, IF NOT EXISTS
).SELECT INTO
pour la création de table est "obsolète".En remarque, la syntaxe pour un CTAS avec un CTE peut sembler un peu bizarre. , et SELECT INTO
peut-être être aussi une sorte de retenue QUEL's RETRIEVE INTO
. QUEL était le prédécesseur de SQL, que le prédécesseur de PostgreSQL (Ingres) utilisait.
Il y a une autre chose que j'ai remarqué qui manque dans la réponse acceptée. En utilisant CREATE TABLE AS
conserve l'attribut nullable de chaque colonne qui semble être ignoré par SELECT INTO
.
Rien que sur cette base, je recommanderais CREATE TABLE AS
. Un cas d'utilisation courant pour les deux instructions est de charger les données d'une longue requête dans une table sans verrouiller cette table pendant la durée de votre requête. Vous créez une table temporaire à l'aide de l'une des commandes ci-dessus, y insérez les résultats de la requête longue, puis insérez ces résultats dans la table d'origine. La conservation de l'attribut nullable dans votre table temporaire réduit les risques d'échec de votre deuxième insertion.
Testé sur PG 11, donc peut-être une fonctionnalité plus récente depuis la réponse à cette question.