PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

In psql, perché alcuni comandi non hanno effetto?

Le affermazioni terminano con un punto e virgola.

In psql , premendo invio senza un punto e virgola si continua l'istruzione alla riga successiva, aggiungendo ciò che si è scritto nel buffer della query anziché eseguirlo. Noterai che il prompt cambia da dbname=> a dbname-> per indicare che sei su una linea di continuazione.

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

Nota come dopo aver premuto Invio senza punto e virgola, il prompt cambia in regress-# e non viene intrapresa alcuna azione. Non esiste una tabella sometable , quindi se l'istruzione fosse stata eseguita verrebbe segnalato un errore.

Quindi, vedi l'uso di \r alla riga successiva? Ciò cancella il buffer della query. Nota che il prompt torna a regress=# quando il buffer viene cancellato, poiché non ci sono più istruzioni parziali memorizzate nel buffer.

Questo mostra come le istruzioni possono essere suddivise su righe:

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

La cosa confusa è che psql comandi backslash come \d sono terminati da una nuova riga, non da punto e virgola, quindi lo fanno esegui quando premi invio. È utile quando vuoi (diciamo) visualizzare la definizione di una tabella mentre scrivi un'istruzione, ma crea un po' di confusione per i nuovi arrivati.

Per quanto riguarda le tue ulteriori domande:

  1. Se c'è un comando "cancella schermo" in psql per Windows non l'ho ancora trovato. Su Linux uso semplicemente control-L, come qualsiasi altro programma che utilizza readline. In Windows \! cls funzionerà.

  2. DDL in PostgreSQL è transazionale. Puoi BEGIN una transazione, emetti alcuni DDL e COMMIT l'operazione affinché abbia effetto. Se non esegui il tuo DDL in una transazione esplicita, ha effetto immediato.