在psql中,为什么有些命令没有效果?

时间:2012-09-18 07:09:57

标签: postgresql psql

有时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中执行“提交”的概念?

2 个答案:

答案 0 :(得分:22)

声明以分号结尾。

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-#并且不执行任何操作。没有表sometable,因此如果语句已运行,则会报告错误。

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

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

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

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

至于你的其他问题:

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

  2. PostgreSQL中的DDL是事务性的。您可以BEGIN一个事务,发出一些DDL,并COMMIT该事务使其生效。如果您没有在明确的交易中进行DDL,那么它会立即生效。

答案 1 :(得分:3)

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

我正在尝试使用dropdb命令,看到的就像我的命令无效(更改提示意味着我的命令在缓冲区中,但这不是问题所在):

postgres=# dropdb databasename
postgres-#

诸如dropdb之类的命令应该在psql之外输入。我一直在做的是:

$ psql postgres
postgres=# dropdb databasename

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

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

$ dropdb databasename

希望这对一些人有帮助。