CREA TABELLA COME vs SELEZIONA IN


16

PostgreSQL supporta CREATE TABLE ASe SELECT INTOquando uso entrambi?

CREATE TABLE AS - definisce una nuova tabella dai risultati di una query

CREATE TABLE AScrea una tabella e la riempie di dati calcolati da un SELECTcomando. Le colonne della tabella hanno i nomi e i tipi di dati associati alle colonne di output di SELECT(tranne che è possibile sovrascrivere i nomi delle colonne fornendo un elenco esplicito di nuovi nomi di colonna).

CREATE TABLE ASassomiglia un po 'alla creazione di una vista, ma è davvero molto diverso: crea una nuova tabella e valuta la query una sola volta per riempire inizialmente la nuova tabella. La nuova tabella non terrà traccia delle modifiche successive alle tabelle di origine della query. Al contrario, una vista rivaluta la sua SELECTdichiarazione di definizione ogni volta che viene interrogata.

E poi.

SELECT INTO - definisce una nuova tabella dai risultati di una query

SELECT INTOcrea una nuova tabella e la riempie di dati calcolati da una query. I dati non vengono restituiti al client, come è normale SELECT. Le colonne della nuova tabella hanno i nomi e i tipi di dati associati alle colonne di output di SELECT.

Risposte:


15

Senza la spiegazione, utilizzare sempre CREATE TABLE ASsenza eccezioni. Nella parte inferiore di ciascuna delle NOTE, questo viene chiarito,

Note per SELECT INTO,

CREATE TABLE ASè funzionalmente simile a SELECT INTO. CREATE TABLE ASè la sintassi consigliata, poiché questa forma di SELECT INTOnon è disponibile in ECPG o PL / pgSQL, poiché interpretano la clausola INTO in modo diverso. Inoltre, CREATE TABLE ASoffre un superset delle funzionalità fornite da SELECT INTO.

Note per CREATE TABLE AS,

Questo comando è funzionalmente simile a SELECT INTO, ma è preferito poiché è meno probabile che venga confuso con altri usi della SELECT INTOsintassi. Inoltre, CREATE TABLE ASoffre un superset delle funzionalità offerte da SELECT INTO.

Anche nella sezione Compatibilità dei documenti di SELECT INTOesso va ancora oltre,

Lo standard SQL utilizza SELECT INTOper rappresentare la selezione di valori in variabili scalari di un programma host, anziché creare una nuova tabella. Questo è in effetti l'uso trovato in ECPG (vedi capitolo 34) e PL / pgSQL (vedi capitolo 41). L'uso di PostgreSQL SELECT INTOper rappresentare la creazione di tabelle è storico. È meglio usare CREATE TABLE ASa questo scopo nel nuovo codice.

Quindi abbiamo

  1. PostgreSQL ritiene che sia confuso perché SELECT INTOaltre cose in contesti sono disponibili solo in PL / pgSQL ed ECPG.
  2. CREATE TABLEsupporta più funzionalità (suppongo si riferiscano a WITH OIDS, e TABLESPACE, IF NOT EXISTS).
  3. SELECT INTO per la creazione della tabella è "obsoleto".

Come nota a margine , la sintassi di un CTAS con un CTE può apparire un po 'strana. , e SELECT INTO potrebbe anche essere una sorta di controllo sui QUELRETRIEVE INTO . QUEL era il predecessore di SQL, utilizzato dal predecessore di PostgreSQL (INGRES).


1

C'è un'altra cosa che ho notato che manca nella risposta accettata. L'utilizzo CREATE TABLE ASconserva l'attributo nullable di ogni colonna che sembra essere ignorato da SELECT INTO.

Solo su questa base, lo consiglierei CREATE TABLE AS. Un caso d'uso comune per entrambe le istruzioni è caricare i dati da una query a esecuzione prolungata in una tabella senza bloccare quella tabella per la durata della query. È possibile creare una tabella temporanea utilizzando uno dei comandi precedenti, inserire i risultati della query con esecuzione prolungata e quindi inserire tali risultati nella tabella originale. Preservare l'attributo nullable nella tabella temporanea riduce le possibilità di errore del secondo inserto.

Ho provato questo su PG 11, quindi forse una funzionalità più recente da quando è stata data una risposta a questa domanda.


Una query di lunga durata non blocca alcuna tabella. Quindi la motivazione per usare CTAS per quel motivo è inutile
a_horse_with_no_name
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.