如何以正确的方式确定PostgreSQL数据库是否为空



编辑:在stackoverflow上首次搜索中出现的答案是潜在的危险和错误对于PostgreSQL而言。我被它咬了,我删除了一个数据库,该数据库实际上充满了许多模式:SQL检查数据库是否为空(无表)仅适用于mysql。

postgresql具有"将search_path设置为.specified_name"。
这样,您可以在不同的"名称空间"中创建表,人们将其用于将"一个架构"放入一个物理postgresql数据库中。

旧答案中的查询检查默认名称空间。如果这个空,则假定数据库为空。但是,在其他搜索路径中可以还有其他20个数据库方案。用户通常使用"一个数据库",但在不同的搜索路径中运行10个应用程序以避免额外的费用。

所以我再次打开问题。在PostgreSQL中,检查数据库是否为空的正确方法是什么?更具体地说,如何检查它是否是由CreateB创建的"处女"数据库,无法访问物理机器?

正如其他人评论的那样,链接的答案是关于mysql的,在"数据库"one_answers" schema"之间没有区别。

在Postgres中,一个实例(安装)可以具有多个数据库,并且每个数据库都可以具有多个模式。

postgres实例具有至少两个数据库,对于它起作用至关重要:template0template1

您的问题尚不清楚是否要检查是否没有(非默认)数据库,或者是否要检查特定数据库是否包含表格。

案例1-检查是否存在数据库

为此,您需要连接到template1数据库(因为那是您知道在那里的唯一一个。然后,您可以运行此语句:

$ psql -X -U postgres template1
psql (9.6.2)
Type "help" for help.
template1=# select count(*) from pg_database where datname not like 'template%';
 count
-------
    33
(1 row)
template1=#

如果返回0,则您知道系统中没有其他数据库。通常,至少有一个名为postgres的数据库 - 这就是默认安装所做的。但是该数据库不必在那里。

案例2-检查特定数据库是否包含表

如果要检查特定数据库是否不包含表,则需要连接到该数据库并检查表 - 排除所有系统表。最简单的方法是查询pg_class,因为它基本上包含在数据库中可以创建的所有内容,但存储功能除外。

$ psql -U postgres your_database 
psql (9.6.2)
Type "help" for help.
postgres=# select count(*)
postgres-# from pg_class c
postgres-#   join pg_namespace s on s.oid = c.relnamespace
postgres-# where s.nspname not in ('pg_catalog', 'information_schema')
postgres-#   and s.nspname not like 'pg_temp%'
postgres-# ;
 count
-------
   464
(1 row)
postgres=#

这计算了不是"默认" postgres表的表数。

上面的查询对待一个具有许多模式但没有表格的数据库。这取决于您的要求是否为"空"。

您可能还需要检查pg_proc,以确保不存在存储功能,也可能还存在pg_extension pg_foreign_server和其他一些系统目录表。


无关:

Postgres具有SET search_path TO specified_name的功能。这样,您可以在不同的"名称空间"中创建桌子

您无需更改搜索路径即可在不同的模式中创建表:

-- create two schemas
create schema one;
create schema two;
-- create a table in schema one
create table one.some_table;
-- create a table in schema two
create table two.other_table;

search_path仅在那里,因此您不需要始终充分限定表的名称。

最新更新