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中执行“提交”的任何概念?
#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
希望这对一些人有帮助。
评论
发布此类问题时,通常最好提一下PostgreSQL版本。 +1可以清楚地显示正在发生的事情。