web-dev-qa-db-fra.com

CRÉER UN TABLEAU COMME SÉLECTIONNER DANS

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 commande SELECT. Les colonnes de la table ont les noms et les types de données associés aux colonnes de sortie de SELECT (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éfinition SELECT 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 un SELECT normal. Les colonnes de la nouvelle table ont les noms et les types de données associés aux colonnes de sortie de SELECT.

17
Evan Carroll

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 de SELECT 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 par SELECT 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 du SELECT INTO syntaxe. De plus, CREATE TABLE AS offre un surensemble des fonctionnalités offertes par SELECT 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 de SELECT INTO pour représenter la création de table est historique. Il est préférable d'utiliser CREATE TABLE AS à cet effet dans le nouveau code.

Donc nous avons,

  1. PostgreSQL pense que c'est déroutant car SELECT INTO fait d'autres choses dans des contextes uniquement disponibles dans PL/pgSQL et ECPG.
  2. CREATE TABLE prend en charge plus de fonctionnalités (je suppose qu'elles font référence à WITH OIDS et TABLESPACE, IF NOT EXISTS).
  3. 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.

16
Evan Carroll

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.

1
shrumm