PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

No psql, por que alguns comandos não têm efeito?


As declarações terminam com ponto e vírgula.

Em psql , pressionando enter sem ponto e vírgula continua a instrução na próxima linha, adicionando o que você escreveu no buffer de consulta em vez de executá-lo. Você notará que o prompt muda de dbname=> para dbname-> para indicar que você está em uma linha de continuação.
regress=> DROP TABLE sometable
regress-> \r
Query buffer reset (cleared).
regress=> DROP TABLE sometable;
ERROR:  table "sometable" does not exist
regress=> 

Observe como depois de pressionar enter sem ponto e vírgula, o prompt muda para regress-# e nenhuma ação é tomada. Não há tabela sometable , portanto, se a instrução fosse executada, um erro seria relatado.

A seguir, veja o uso de \r na próxima linha? Isso limpa o buffer de consulta. Observe que o prompt muda de volta para regress=# quando o buffer é limpo, pois não há mais nenhuma instrução parcial armazenada em buffer.

Isso mostra como as instruções podem ser divididas em linhas:
regress=> DROP TABLE
regress-> sometable
regress-> ;
ERROR:  table "sometable" does not exist

O confuso é que psql Comandos de barra invertida como \d são terminados por nova linha, não terminados por ponto e vírgula, então eles fazem executar quando você pressionar enter. Isso é útil quando você deseja (digamos) visualizar uma definição de tabela enquanto escreve uma instrução, mas é um pouco confuso para os recém-chegados.

Quanto às suas perguntas adicionais:

  1. Se houver um comando "limpar tela" em psql para Windows ainda não encontrei. No Linux eu apenas uso control-L, da mesma forma que qualquer outro programa que usa readline. No Windows \! cls vai funcionar.

  2. DDL no PostgreSQL é transacional. Você pode BEGIN uma transação, emitir algum DDL e COMMIT a transação para que ela entre em vigor. Se você não fizer seu DDL em uma transação explícita, ele entrará em vigor imediatamente.