有时我在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)


还:


我在Windows中使用PostgreSQL。有没有清除控制台的命令(如Oracle中的cl scr)?
使用DML脚本时,是否需要在Postgresql中执行“提交”的任何概念?


评论

发布此类问题时,通常最好提一下PostgreSQL版本。 +1可以清楚地显示正在发生的事情。

#1 楼

语句以分号结尾。

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之类的反斜杠命令是换行符终止的,而不是分号终止的,因此当您按Enter键时它们会运行。当您要在编写语句时查看(定义)表定义时很方便,但是对于新手来说有点困惑。

关于其他问题:


如果Windows的\d中存在“清除屏幕”命令,则尚未找到它。在Linux上,我只使用control-L,与其他任何使用readline的程序相同。在Windows中,psql可以使用。
PostgreSQL中的DDL是事务性的。您可以执行一个事务,发出一些DDL,然后执行该事务以使其生效。如果您未在显式事务中执行DDL,则该DDL立即生效。


#2 楼

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

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

postgres=# dropdb databasename
postgres-#


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

$ psql postgres
postgres=# dropdb databasename


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

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

$ dropdb databasename


希望这对一些人有帮助。