Postgresql:检查架构是否存在?

Chr*_*ell 57 sql postgresql

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

目前,我这样做:

select exists (select * from pg_catalog.pg_namespace where nspname = 'schemaname');
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*aut 84

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

SELECT schema_name FROM information_schema.schemata WHERE schema_name = 'name';
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这是一个很好的答案.以下是我如何将其扩展为完全满足我的需求:`SELECT exists(select schema_name FROM information_schema.schemata WHERE schema_name ='foo');` (14认同)

Bor*_*rys 55

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

SELECT EXISTS(SELECT 1 FROM information_schema.schemata 
              WHERE schema_name = 'name');
Run Code Online (Sandbox Code Playgroud)

查询information_schema

如果直接查询pg_namespace:

SELECT EXISTS(SELECT 1 FROM pg_namespace WHERE nspname = 'name');
Run Code Online (Sandbox Code Playgroud)

刨床的工作要简单得多:

在此输入图像描述

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

  • 它们的执行时间几乎相同(0.034 秒)。“几毫秒”在这里确实是一个延伸...... (2认同)

Gle*_*enn 18

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

DO $$
BEGIN

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

END
$$;
Run Code Online (Sandbox Code Playgroud)


Vin*_*nay 9

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

IF EXISTS:
Do not throw an error if the schema does not exist. A notice is issued in this case.
Run Code Online (Sandbox Code Playgroud)

所以,

DROP SCHEMA IF EXISTS schema_Name
Create SCHEMA schema_Name
Run Code Online (Sandbox Code Playgroud)


gyo*_*fov 9

如果您想创建一个模式(如果它不存在),您可以执行:

CREATE SCHEMA IF NOT EXISTS foo
Run Code Online (Sandbox Code Playgroud)

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