PostgreSQL: 为什么在 psql 中使用 DROP DATABASE databaseName 命令删除数据库后,模式和关系仍然存在?

4
在Postgres中,可以使用\i <path>命令从文件执行命令。我通过创建一个数据库、一个模式、一些表和一个视图来实现这个功能,具体操作请参考下面的小文件:
DROP DATABASE IF EXISTS databaseName;
CREATE DATABASE databaseName ;

CREATE SCHEMA IF NOT EXISTS databaseName_schema;

CREATE TABLE IF NOT EXISTS databaseName_schema.tableName (
   id SERIAL PRIMARY KEY,
   name VARCHAR(80),
   surename VARCHAR(80),
);


CREATE TABLE IF NOT EXISTS databaseName_schema.tableMovies (
    id SERIAL PRIMARY KEY,
    priority SERIAL,
    movieName VARCHAR(40)
);
   
create or replace view versionViewTest as select version();

我使用了 \l 语句进行检查,确认数据库 "databaseName" 存在。 如果我然后...
DROP DATABASE databaseName;

重新检查一下,数据库已经消失了!但是,当我再次执行同样的脚本时

\i <path>

内容为:

...模式已存在,跳过创建模式 ...关系已经存在,跳过创建表

我已经花了一些时间阅读关于模式、关系和Postgres的文章,但是仍然不知道我缺少什么。

我的期望是:如果我删除一个数据库,它包含的组件也应该被删除,但是某种情况下psql并没有删除它们,而是在将来创建具有完全相同名称的数据库时重用它们。 为什么会这样呢? 我应该如何删除带有全部内容的数据库?

PS:任何关于该主题的讲座都受欢迎,以及直接回答。


2
你忘记连接到新创建的数据库。 - Vao Tsun
创建数据库复制template1,也许你可以在模板数据库中找到那些模式和表? - user330315
我相信Simeon在他连接的数据库中创建模式,因此删除/创建数据库对于下一个语句变得无关紧要。 - Vao Tsun
@VaoTsun 当我执行缺少连接语句的脚本时,我并没有主动连接到任何数据库。您的评论是否意味着在这种情况下我始终连接到默认数据库? - Simeon
不能是我连接了我删除的旧数据库,因为它已经不存在了,在列出所有数据库时也不再显示 \l。 - Simeon
显示剩余2条评论
1个回答

4

您忘记连接到数据库:

DROP DATABASE IF EXISTS databaseName;
CREATE DATABASE databaseName ;
\c databaseName 
CREATE SCHEMA IF NOT EXISTS databaseName_schema;
...

非常感谢!一旦计时器允许,我将接受此答案作为正确答案。 额外澄清:在添加了psql特定命令'\c databaseName'后,将脚本命名为".sql"是否被认为是“肮脏”的? - Simeon
这是一种常见的做法,但是 psql 元命令并不是 SQL 语句。我认为这是一个选择问题。 - Vao Tsun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接