it-swarm.com.de

CREATE TABLE AS vs SELECT INTO

PostgreSQL unterstützt CREATE TABLE AS und SELECT INTO wann benutze ich beide?

CREATE TABLE AS - Definiere eine neue Tabelle aus den Ergebnissen einer Abfrage

CREATE TABLE AS erstellt eine Tabelle und füllt sie mit Daten, die mit einem Befehl SELECT berechnet wurden. Die Tabellenspalten haben die Namen und Datentypen, die den Ausgabespalten von SELECT zugeordnet sind (außer dass Sie die Spaltennamen überschreiben können, indem Sie eine explizite Liste neuer Spaltennamen angeben).

CREATE TABLE AS hat etwas Ähnlichkeit mit dem Erstellen einer Ansicht, ist aber ganz anders: Es erstellt eine neue Tabelle und wertet die Abfrage nur einmal aus, um die neue Tabelle zunächst zu füllen. Die neue Tabelle verfolgt keine nachfolgenden Änderungen an den Quelltabellen der Abfrage. Im Gegensatz dazu wertet eine Ansicht ihre definierende Anweisung SELECT bei jeder Abfrage neu aus.

Und dann.

SELECT INTO - Definiere eine neue Tabelle aus den Ergebnissen einer Abfrage

SELECT INTO erstellt eine neue Tabelle und füllt sie mit Daten, die von einer Abfrage berechnet wurden. Die Daten werden nicht wie bei einem normalen SELECT an den Client zurückgegeben. Die Spalten der neuen Tabelle enthalten die Namen und Datentypen, die den Ausgabespalten von SELECT zugeordnet sind.

17
Evan Carroll

Verwenden Sie ohne Erklärung immer ausnahmslos CREATE TABLE AS. Am Ende jeder unter [~ # ~] Notizen [~ # ~] wird dies geklärt,

Hinweise für SELECT INTO ,

CREATE TABLE AS Ist funktional ähnlich wie SELECT INTO. CREATE TABLE AS Ist die empfohlene Syntax, da diese Form von SELECT INTO In ECPG oder PL/pgSQL nicht verfügbar ist, da sie die INTO-Klausel unterschiedlich interpretieren. Darüber hinaus bietet CREATE TABLE AS Eine Obermenge der von SELECT INTO Bereitgestellten Funktionalität.

Hinweise für CREATE TABLE AS ,

Dieser Befehl ähnelt funktional SELECT INTO, Wird jedoch bevorzugt, da er weniger wahrscheinlich mit anderen Verwendungen der Syntax SELECT INTO Verwechselt wird. Darüber hinaus bietet CREATE TABLE AS Eine Obermenge der von SELECT INTO Angebotenen Funktionalität.

Auch im Abschnitt Kompatibilität der Dokumente von SELECT INTO Geht es noch weiter,

Der SQL-Standard verwendet SELECT INTO, Um die Auswahl von Werten in skalaren Variablen eines Host-Programms darzustellen, anstatt eine neue Tabelle zu erstellen. Dies ist in der Tat die Verwendung in ECPG (siehe Kapitel 34) und PL/pgSQL (siehe Kapitel 41). Die PostgreSQL-Verwendung von SELECT INTO Zur Darstellung der Tabellenerstellung ist historisch. Es ist am besten, CREATE TABLE AS Für diesen Zweck in zu verwenden neuer Code.

Also haben wir,

  1. PostgreSQL findet es verwirrend, weil SELECT INTO Andere Aufgaben in Kontexten ausführt, die nur in PL/pgSQL und ECPG verfügbar sind.
  2. CREATE TABLE Unterstützt mehr Funktionen (ich nehme an, sie beziehen sich auf WITH OIDS Und TABLESPACE, IF NOT EXISTS).
  3. SELECT INTO Für die Tabellenerstellung ist "veraltet".

Als Randnotiz kann die Syntax für a CTAS mit einem CTE etwas seltsam aussehen. und SELECT INTO may auch eine Art Hold sein über QUELs RETRIEVE INTO . QUEL war der Vorgänger von SQL, den der Vorgänger von PostgreSQL (Ingres) verwendete.

16
Evan Carroll

Es gibt noch eine andere Sache, die mir aufgefallen ist und die in der akzeptierten Antwort fehlt. Bei Verwendung von CREATE TABLE AS Wird das nullfähige Attribut jeder Spalte beibehalten, das von SELECT INTO Ignoriert zu werden scheint.

Allein auf dieser Basis würde ich CREATE TABLE AS Empfehlen. Ein häufiger Anwendungsfall für beide Anweisungen ist das Laden von Daten aus einer lang laufenden Abfrage in eine Tabelle, ohne diese Tabelle für die Dauer Ihrer Abfrage zu sperren. Sie erstellen eine temporäre Tabelle mit einem der oben genannten Befehle, fügen die lang laufenden Abfrageergebnisse dort ein und fügen diese Ergebnisse in die ursprüngliche Tabelle ein. Das Beibehalten des nullbaren Attributs in Ihrer temporären Tabelle verringert die Wahrscheinlichkeit, dass Ihre zweite Einfügung fehlschlägt.

Getestet auf PG 11, also vielleicht eine neuere Funktion, da diese Frage beantwortet wurde.

1
shrumm