Postgresql:检查架构是否存在?

时间:2011-08-10 19:14:19

标签: sql postgresql

我需要动态创建,管理和删除模式。如果我去创建一个已经存在的模式,我想(有条件地,通过外部手段)删除并按指定重新创建它。如何检查Postgres 9服务器上是否存在所述模式?

目前,我正在这样做:

select exists (select * from pg_catalog.pg_namespace where nspname = 'schemaname');

但我觉得可能有另一种方式......这是查询Postgres是否存在特定模式的“正确”方法吗?

10 个答案:

答案 0 :(得分:79)

以下查询将告诉您模式是否存在。

SELECT schema_name FROM information_schema.schemata WHERE schema_name = 'name';

答案 1 :(得分:49)

如果你是一个纯粹的纯粹主义者,或者你想获得一些诅咒。我建议你使用postgres原生系统目录。可以避免然后通过调用pg_catalog引起的嵌套循环......

SELECT EXISTS(SELECT 1 FROM information_schema.schemata 
              WHERE schema_name = 'name');

querying information_schema

如果直接查询pg_namespace:

SELECT EXISTS(SELECT 1 FROM pg_namespace WHERE nspname = 'name');

Planer的工作要简单得多:

enter image description here

所以你自己的解决方案是最好的

答案 2 :(得分:16)

与寻求条件架构创建的其他人有点相关并且可能感兴趣。我发现自己在一些创建脚本中使用了这样的代码:

DO $$
BEGIN

    IF NOT EXISTS(
        SELECT schema_name
          FROM information_schema.schemata
          WHERE schema_name = 'pgcrypto'
      )
    THEN
      EXECUTE 'CREATE SCHEMA pgcrypto';
    END IF;

END
$$;

答案 3 :(得分:9)

这可能是其中一种方法。首先删除架构,然后创建它。

IF EXISTS:
Do not throw an error if the schema does not exist. A notice is issued in this case.

所以,

DROP SCHEMA IF EXISTS schema_Name
Create SCHEMA schema_Name

答案 4 :(得分:3)

如果要创建不存在的架构,则可以执行:

CREATE SCHEMA IF NOT EXISTS foo

来源:https://www.postgresql.org/docs/current/sql-createschema.html

答案 5 :(得分:1)

来自http://www.postgresql.org/docs/9.1/static/infoschema-schemata.html(强调我自己):

  

视图架构包含当前数据库中当前启用的角色所拥有的所有架构

所以你的原始解决方案/查询比Peter的更可靠,尽管是非标准的。

答案 6 :(得分:0)

如果你在特定模式中有对象(表,sprocs,视图),那么这些将无效 - 在DROP期间它将失败......

创建&管理是容易的部分..它会让你失望..无论如何,我找不到合适的答案,所以我在这里张贴给其他人..

在此处查看链接: http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/4753d1b8-f547-44c6-b205-aa2dc22606ba/#6eb8238a-305e-40d5-858e-0fbd70454810

答案 7 :(得分:0)

这个对我有用(Postgres 9.3):

Select exists (SELECT 1 FROM information_schema.schemata where catalog_name = 'My_BD_with_UpperCase_characters_in_its_Name')

答案 8 :(得分:0)

使用

SELECT EXISTS (SELECT 1 FROM pg_catalog.pg_namespace WHERE nspowner <> 1 AND nspname = 'schemaname');

如果您选中https://www.postgresql.org/docs/current/static/infoschema-schemata.html,则会看到

  

视图架构包含当前用户有权访问的当前数据库中的所有架构(作为所有者或拥有某些权限)。

这意味着使用information_schema.schemata的已接受答案中的查询不会显示当前用户不是所有者或没有USAGE权限的模式。

SELECT 1
FROM pg_catalog.pg_namespace
WHERE nspowner <> 1 -- ignore tables made by postgres itself
AND nspname = 'schemaname';

更完整,并且将显示postgres未自行创建的所有现有模式,无论您是否有权访问模式。

答案 9 :(得分:0)

这对 PostgreSQL 有效,它将检查模式是否存在,如果不存在则创建它:

CREATE SCHEMA IF NOT EXISTS tenant;