PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Warum haben einige Befehle in psql keine Wirkung?

Anweisungen enden mit Semikolons.

In psql , das Drücken der Eingabetaste ohne Semikolon setzt die Anweisung in der nächsten Zeile fort und fügt das, was Sie geschrieben haben, dem Abfragepuffer hinzu, anstatt es auszuführen. Sie werden feststellen, dass sich die Eingabeaufforderung von dbname=> ändert zu dbname-> um anzuzeigen, dass Sie sich in einer Fortsetzungszeile befinden.

regress=> DROP TABLE sometable
regress-> \r
Query buffer reset (cleared).
regress=> DROP TABLE sometable;
ERROR:  table "sometable" does not exist
regress=> 

Beachten Sie, dass sich die Eingabeaufforderung in regress-# ändert, nachdem ich die Eingabetaste ohne Semikolon gedrückt habe und es wird nichts unternommen. Es gibt keine Tabelle sometable , wenn also die Anweisung ausgeführt worden wäre, würde ein Fehler gemeldet werden.

Sehen Sie sich als Nächstes die Verwendung von \r an in der nächsten Zeile? Das löscht den Abfragepuffer. Beachten Sie, dass sich die Eingabeaufforderung wieder in regress=# ändert wenn der Puffer gelöscht wird, da keine Teilanweisung mehr gepuffert ist.

Dies zeigt, wie Anweisungen über Zeilen verteilt werden können:

regress=> DROP TABLE
regress-> sometable
regress-> ;
ERROR:  table "sometable" does not exist

Das Verwirrende ist, dass psql Backslash-Befehle wie \d werden durch Zeilenumbrüche beendet, nicht durch Semikolons, also tun sie es ausführen, wenn Sie die Eingabetaste drücken. Das ist praktisch, wenn Sie (sagen wir) eine Tabellendefinition sehen möchten, während Sie eine Anweisung schreiben, aber es ist für Neulinge etwas verwirrend.

Was Ihre zusätzlichen Fragen angeht:

  1. Wenn in psql ein Befehl zum Löschen des Bildschirms vorhanden ist für Windows habe ich es noch nicht gefunden. Unter Linux verwende ich einfach Control-L, genau wie bei jedem anderen Programm, das Readline verwendet. Unter Windows \! cls wird funktionieren.

  2. DDL in PostgreSQL ist transaktional. Sie können BEGIN eine Transaktion, geben Sie eine DDL aus und COMMIT die Transaktion, damit sie wirksam wird. Wenn Sie Ihre DDL nicht in einer expliziten Transaktion ausführen, tritt sie sofort in Kraft.