Verwenden der temporären Tabelle in der PL / pgSQL-Prozedur zum Bereinigen von Tabellen

7

Ich versuche, alle Daten zu einer Benutzer-ID aus einer Spieldatenbank zu löschen.

Es gibt eine Tabelle mit allen Spielen (jeweils gespielt von 3 Spielern):

%Vor%

Und es gibt einen Tisch, auf dem Spieler Punkte für das Spiel Nr. 321 haben:

%Vor%

Wenn ich die folgende SELECT INTO-Anweisung für die psql-Eingabeaufforderung von PostgreSQL ausprobiere, scheint sie wie erwartet zu funktionieren (und die temporäre Tabelle verschwindet, wenn die Sitzung geschlossen wird):

%Vor%

Aber wenn ich versuche, meine PL / pgSQL-Prozedur zu erstellen, erhalte ich einen Fehler:

%Vor%

Der Fehler:

%Vor%

Warum (temporäre Tabellen sind hier nicht erlaubt?) und wo kann ich meine temporäre Liste der zu löschenden GIDs speichern?

(Und ich würde es vorziehen, "on delete cascade" nicht zu verwenden, da ich noch nicht daran gewöhnt bin und meine Skripte / Datenbank noch nicht darauf vorbereitet sind).

    
Alexander Farber 28.10.2011, 17:52
quelle

3 Antworten

9

Sie könnten die temporäre Tabelle erstellen und dann die üblichen INSERT ... SELECT als separate Operationen ausführen:

%Vor%

Es gibt auch eine LIKE-Option, um TABELLE zu erstellen, wenn Sie eine Tabelle duplizieren möchten Struktur:

  

LIKE parent_table [ like_option ... ]
  Die Klausel LIKE gibt eine Tabelle an, aus der die neue Tabelle automatisch alle Spaltennamen, ihre Datentypen und ihre Nicht-Null-Einschränkungen kopiert.

Aber ich denke, Sie brauchen nur eine temporäre Tabelle, um einige IDs zu halten, also ist das wahrscheinlich Overkill.

SELECT INTO funktioniert wie erwartet außerhalb einer Prozedur :

  

[...] Diese Form von SELECT INTO ist in ECPG oder PL / pgSQL nicht verfügbar, weil sie die INTO-Klausel anders interpretieren.

SELECT INTO wird verwendet, um das Ergebnis eines SELECT in einer lokalen Variablen zu speichern in einem PostgreSQL-Verfahren :

  

Das Ergebnis eines SQL-Befehls, der eine einzelne Zeile (möglicherweise mehrere Spalten) ergibt, kann einer Datensatzvariablen, einer Zeilentypvariablen oder einer Liste von Skalarvariablen zugewiesen werden. Dazu schreiben Sie den Basis-SQL-Befehl und fügen eine INTO -Klausel hinzu.

    
mu is too short 28.10.2011, 18:24
quelle
12

Neben dem expliziten Erstellen einer temporären Tabelle und dem Einfügen in diese gibt es noch eine andere, einfachere richtige Methode: CREATE TEMP TABLE AS als in den Dokumenten empfohlen :

  

Dieser Befehl ist funktional ähnlich wie SELECT INTO , aber es ist   bevorzugt, da es weniger wahrscheinlich ist, mit anderen Verwendungen von   die SELECT INTO -Syntax. Darüber hinaus bietet CREATE TABLE AS eine Obermenge   der von SELECT INTO angebotenen Funktionalität.

Für Postgres 9.1 oder höher siehe unten.

Es wäre auch effizienter, DELETE .. USING .. anstelle einer Unterauswahl.
Und ja, wenn Sie die temporäre Tabelle nicht außerhalb der Funktion verwenden, fügen Sie ON COMMIT DROP hinzu.

Wenn Sie alles zusammensetzen, könnte Ihre Funktion so aussehen:

%Vor%

Daten modifizierendes CTE

Im modernen Postgres ist das obige nur für komplizierte Operationen sinnvoll, wo Sie eine aktuelle temporäre Tabelle brauchen, um damit zu arbeiten - zum Beispiel um einen Index darüber zu erstellen, bevor Sie fortfahren.

In Postgres 9.1 oder höher verwenden Sie Daten modifizierende CTEs für einfache Fälle wie die vorliegende:

%Vor%     
Erwin Brandstetter 29.10.2011 22:52
quelle
1

Sie können versuchen

%Vor%     
Michael Krelin - hacker 28.10.2011 20:13
quelle

Tags und Links