PostgreSQL:为啥 DROP DATABASE databaseName 在 psql 中保留已删除数据库的模式和关系?

Posted

技术标签:

【中文标题】PostgreSQL:为啥 DROP DATABASE databaseName 在 psql 中保留已删除数据库的模式和关系?【英文标题】:PostgreSQL: Why does DROP DATABASE databaseName keep Schemas and Relations of the deleted DB in psql?PostgreSQL:为什么 DROP DATABASE databaseName 在 psql 中保留已删除数据库的模式和关系? 【发布时间】:2017-09-07 23:48:36 【问题描述】:

在 Postgres 中,PSQL 可以使用 \i <path> 命令从文件中执行命令。

我通过这个小文件创建了一个 DATABASE、一个 SCHEMA、一些 TABLES 和一个 VIEW:

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;

并重新检查\l 数据库已消失! 但是,当我再次使用

执行相同的脚本时
\i <path>

上面写着:

...模式已经存在,正在跳过 CREATE SCHEMA ...关系已经存在,跳过 CREATE TABLE

我已经花了一些时间阅读有关架构、关系和 Postgres 的内容,但不知道我缺少什么。

我的期望是:如果我删除一个数据库,它包含的组件也会被删除,但是 psql 不会删除它们,而是在将来创建具有完全相同名称的数据库时重用它们。 为什么会有用? 以及如何删除包含所有内容的数据库?

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

【问题讨论】:

你错过了连接到新创建的数据库 create database 复制template1 也许您在模板数据库中有那些模式和表? 我相信 Simeon 在他连接的数据库中创建了模式,因此删除/创建数据库与下一条语句无关 @VaoTsun 在执行缺少连接语句的脚本时,我没有主动连接到任何数据库。您的评论是否暗示在这种情况下我总是连接到默认数据库? 是的。如果您将连接到您删除的数据库,它将不允许您这样做。 psql 也只有在连接到某些数据库后才会启动“终端” 【参考方案1】:

你忘记连接数据库了:

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

【讨论】:

非常感谢!只要计时器允许,我就会接受这个作为正确答案。附加说明:在添加特定于 psql 的命令 '\c databaseName' 后,将脚本命名为“.sql”会被视为“脏”吗? 这是常见的做法,但 psql 元命令并不是 SQL 语句。我相信这是一个选择问题。

以上是关于PostgreSQL:为啥 DROP DATABASE databaseName 在 psql 中保留已删除数据库的模式和关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PostgreSQL 的 DROP/CREATE/INSERT 语句中简洁地使用 SET 变量?

Postgresql DROP TABLE 不起作用

postgresql如何禁止在数据库执行drop table操作

为啥这个网页上没有触发“drop”事件?

为啥 '@drop' 事件在 vue 中对我不起作用?

为啥'reset_index(drop = True)'函数会意外删除列?