sql >> Databáze >  >> RDS >> PostgreSQL

Proč v psql nemají některé příkazy žádný účinek?

Příkazy končí středníky.

V psql , stisknutím klávesy enter bez středníku pokračujete v příkazu na další řádek, místo toho, abyste to provedli, přidá to, co jste napsali, do vyrovnávací paměti dotazu. Všimnete si, že výzva se změní z dbname=> na dbname-> pro označení, že jste na pokračovací lince.

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

Všimněte si, že když stisknu enter bez středníku, výzva se změní na regress-# a není provedena žádná akce. Neexistuje žádná tabulka sometable , takže pokud by byl příkaz spuštěn, byla by hlášena chyba.

Dále se podívejte na použití \r na dalším řádku? Tím se vymaže vyrovnávací paměť dotazů. Všimněte si, že výzva se změní zpět na regress=# když je vyrovnávací paměť vymazána, protože již není uložen žádný částečný příkaz.

Toto ukazuje, jak lze příkazy rozdělit na řádky:

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

Matoucí je, že psql příkazy zpětného lomítka jako \d jsou ukončeny novým řádkem, nikoli středníkem, takže dělají spustit, když stisknete enter. To je užitečné, když chcete (řekněme) zobrazit definici tabulky při psaní příkazu, ale pro nováčky je to trochu matoucí.

Pokud jde o vaše dodatečné otázky:

  1. Pokud je v psql příkaz "clear screen". pro Windows jsem to zatím nenašel. Na Linuxu používám pouze control-L, stejně jako jakýkoli jiný program využívající readline. Ve Windows \! cls bude fungovat.

  2. DDL v PostgreSQL je transakční. Můžete BEGIN transakci, vydat nějaké DDL a COMMIT aby transakce vstoupila v platnost. Pokud neprovedete svůj DDL v explicitní transakci, vstoupí v platnost okamžitě.



  1. Postgresql rekurzivní vlastní připojení

  2. .další problém s vložením JDBC

  3. Jak na serveru SQL Server pivotovat pro více sloupců

  4. Změňte port Oracle z portu 8080