有时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中执行“提交”的概念?
答案 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键时它们执行运行。当你想在编写语句时(比如说)查看表定义时,这很方便,但对于新手来说这有点令人困惑。
至于你的其他问题:
如果有"清除屏幕"用于Windows的psql
命令我还没有找到它。在Linux上我只使用control-L,与任何其他使用readline的程序相同。在Windows \! cls
中可以使用。
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
希望这对一些人有帮助。