22

有时我的命令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 中执行“提交”的任何概念吗?

4

2 回答 2

42

语句以分号结尾。

psql中,按不带分号的 enter 将语句继续到下一行,将您写入的内容添加到查询缓冲区而不是执行它。您会注意到提示从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-#并且不执行任何操作。没有 table sometable,因此如果该语句已运行,则会报告错误。

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

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

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

令人困惑的是,psql像这样的反斜杠命令\d是以换行符结尾的,而不是以分号结尾的,所以当你按下回车键时它们会运行。当您想(比如说)在编写语句时查看表定义时,这很方便,但对于新手来说有点混乱。

至于您的其他问题:

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

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

于 2012-09-18T07:26:05.093 回答
6

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

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

postgres=# dropdb databasename
postgres-#

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

$ psql postgres
postgres=# dropdb databasename

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

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

$ dropdb databasename

希望这可以帮助一些人。

于 2020-03-08T21:09:09.067 回答