PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Dans psql, pourquoi certaines commandes n'ont-elles aucun effet ?

Les instructions se terminent par des points-virgules.

En psql , appuyez sur Entrée sans point-virgule pour continuer l'instruction sur la ligne suivante, en ajoutant ce que vous avez écrit au tampon de requête plutôt que de l'exécuter. Vous remarquerez que l'invite change de dbname=> vers dbname-> pour indiquer que vous êtes sur une ligne de continuation.

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

Remarquez comment après avoir appuyé sur Entrée sans point-virgule, l'invite se transforme en regress-# et aucune mesure n'est prise. Il n'y a pas de table sometable , donc si l'instruction s'était exécutée, une erreur serait signalée.

Ensuite, voyez l'utilisation de \r sur la ligne suivante ? Cela efface le tampon de requête. Notez que l'invite redevient regress=# lorsque le tampon est vidé, car il n'y a plus d'instruction partielle mise en tampon.

Cela montre comment les instructions peuvent être réparties sur plusieurs lignes :

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

La chose déroutante est que psql commandes antislash comme \d sont terminés par une nouvelle ligne et non par un point-virgule, donc ils font exécuter lorsque vous appuyez sur entrée. C'est pratique lorsque vous voulez (par exemple) afficher une définition de table tout en écrivant une instruction, mais c'est un peu déroutant pour les nouveaux arrivants.

En ce qui concerne vos questions supplémentaires :

  1. S'il y a une commande "clear screen" dans psql pour Windows, je ne l'ai pas encore trouvé. Sous Linux, j'utilise simplement control-L, comme tout autre programme utilisant readline. Sous Windows \! cls fonctionnera.

  2. DDL dans PostgreSQL est transactionnel. Vous pouvez BEGIN une transaction, émettez du DDL et COMMIT l'opération pour qu'elle prenne effet. Si vous ne faites pas votre DDL dans une transaction explicite, cela prend effet immédiatement.