【问题标题】:In psql, why do some commands have no effect?在psql中,为什么有些命令没有效果?
【发布时间】:2012-09-10 10:09:00
【问题描述】:

有时我在psql 中的命令似乎没有任何效果。知道为什么吗?

下面是数据库library_development中所有表的列表:

library_development=> \d

               List of relations
 Schema |       Name        | Type  |  Owner
--------+-------------------+-------+----------
 public | Pavan             | table | postgres
 public | schema_migrations | table | sai
(2 rows)

在此之后我删除了表 Pavan 使用

library_development-> drop table Pavan

但表格并没有被删除,它的显示如下所示

library_development=> \d
               List of relations
 Schema |       Name        | Type  |  Owner
--------+-------------------+-------+----------
 public | Pavan             | table | postgres
 public | schema_migrations | table | sai
(2 rows)

还有:

  1. 我在 Windows 中使用 PostgreSQL。是否有清除控制台的命令(如 Oracle 中的 cl scr)?

  2. 在使用 DML 脚本时,我需要在 Postgresql 中执行“提交”的任何概念吗?

【问题讨论】:

  • 在发布此类问题时,提及您的 PostgreSQL 版本通常是个好主意。不过,+1 可以清楚地显示正在发生的事情。

标签: postgresql psql


【解决方案1】:

语句以分号结尾。

psql 中,按不带分号的回车键将语句继续到下一行,将您写入的内容添加到查询缓冲区而不是执行它。您会注意到提示符从dbname=> 变为dbname->,表示您正在续行。

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

请注意,当我按下不带分号的 Enter 后,提示变为 regress-# 并且没有采取任何操作。没有表sometable,所以如果语句运行了会报错。

接下来,看到下一行\r的用法了吗?这会清除查询缓冲区。请注意,当缓冲区被清除时,提示会变回regress=#,因为不再缓冲部分语句。

这显示了如何跨行拆分语句:

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

令人困惑的是,psql 之类的反斜杠命令(如 \d)是以换行符结尾的,而不是以分号结尾的,因此它们确实在您按 Enter 时运行。当您想(比如说)在编写语句时查看表定义时,这很方便,但对于新手来说有点混乱。

至于您的其他问题:

  1. 如果psql 中有 Windows 的“清除屏幕”命令,我还没有找到。在 Linux 上,我只使用 control-L,与任何其他使用 readline 的程序相同。在 Windows 中\! cls 可以工作。

  2. PostgreSQL 中的 DDL 是事务性的。你可以BEGIN一个事务,发出一些DDL,然后COMMIT事务让它生效。如果您不在显式事务中执行 DDL,则它会立即生效。

【讨论】:

    【解决方案2】:

    我刚遇到类似的事情,但原因不同。

    我试图使用 dropdb 命令,但我看到的就像我的命令没有效果(提示更改意味着我的命令在缓冲区中,但这不是这里的问题):

    postgres=# dropdb databasename
    postgres-#
    

    像 dropdb 这样的命令应该在 psql 之外输入。我一直在做的是:

    $ psql postgres
    postgres=# dropdb databasename
    

    请注意,第一个命令在 Bash 中并触发 psql,第二个命令在 psql 中发送。

    正确的方式是直接在bash(控制台)中发送命令:

    $ dropdb databasename
    

    希望这对一些人有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-07-05
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      相关资源
      最近更新 更多