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 变量?