如何确定postgresql数据库是否为空正确的方法

时间:2017-03-09 10:21:34

标签: database postgresql

编辑: 在stackoverflow的第一次搜索中出现的答案是postgresql的潜在危险和错误。我被它咬了,我删除了一个实际上充满了很多模式的数据库: SQL to check if database is empty (no tables)仅适用于mysql。

Postgresql的功能是" SET search_path TO .specified_name"。
通过这种方式,您可以在不同的名称空间"中创建表格,人们使用它来放置超过"一个模式"到一个物理postgresql数据库。

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

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

1 个答案:

答案 0 :(得分:4)

正如其他人所评论的那样,链接的答案是关于MySQL的,其中"数据库"和"架构"。

在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以及其他一些system catalog tables

无关:

  

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只在那里,所以你不需要总是完全限定表的名称。