我需要动态创建、管理和删除模式(schema)。如果我要创建的模式已经存在,我希望能够(通过外部手段)有条件地将其删除并按照指定重新创建。如何检查PostgreSQL 9服务器上是否存在该模式?
目前,我的做法是:
select exists (select * from pg_catalog.pg_namespace where nspname = 'schemaname');
但我感觉可能还有其他方法...这是查询Postgres特定schema存在的“正确”方式吗?
我需要动态创建、管理和删除模式(schema)。如果我要创建的模式已经存在,我希望能够(通过外部手段)有条件地将其删除并按照指定重新创建。如何检查PostgreSQL 9服务器上是否存在该模式?
目前,我的做法是:
select exists (select * from pg_catalog.pg_namespace where nspname = 'schemaname');
但我感觉可能还有其他方法...这是查询Postgres特定schema存在的“正确”方式吗?
以下查询将告诉您模式是否存在。
SELECT schema_name FROM information_schema.schemata WHERE schema_name = 'name';
SELECT exists(select schema_name FROM information_schema.schemata WHERE schema_name = 'foo');
(翻译:查询是否存在名为'foo'的模式) - Chris Cashwell`select distinct table_schema from information_schema.tables where
table_schema = 'name'`
- RoflWaffle17如果您是完美主义者或想要节省一些时间,我建议您使用Postgres的本地系统目录。这样可以避免由调用pg_catalog引起的嵌套循环...
SELECT EXISTS(SELECT 1 FROM information_schema.schemata
WHERE schema_name = 'name');
如果您直接查询pg_namespace:
SELECT EXISTS(SELECT 1 FROM pg_namespace WHERE nspname = 'name');
计划员的工作要简单得多:
因此你自己的解决方案是最好的。
对于其他寻找条件模式创建的人可能有所帮助的相关内容。在我的一些创建脚本中,我发现自己使用了类似以下代码的方式:
DO $$
BEGIN
IF NOT EXISTS(
SELECT schema_name
FROM information_schema.schemata
WHERE schema_name = 'pgcrypto'
)
THEN
EXECUTE 'CREATE SCHEMA pgcrypto';
END IF;
END
$$;
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
CREATE SCHEMA IF NOT EXISTS foo
来源:https://www.postgresql.org/docs/current/sql-createschema.html
CREATE SCHEMA命令用于创建模式。 模式只是命名空间的集合,用于将数据库对象分组在一起。 CREATE SCHEMA命令除了指定模式名称之外,还可以指定该模式的所有者和架构授权。CREATE SCHEMA IF NOT EXISTS tenant;
使用
SELECT EXISTS (SELECT 1 FROM pg_catalog.pg_namespace WHERE nspowner <> 1 AND nspname = 'schemaname');
information_schema.schemata
的已接受答案中的查询不会显示当前用户不是所有者或没有USAGE
特权的模式。SELECT 1
FROM pg_catalog.pg_namespace
WHERE nspowner <> 1 -- ignore tables made by postgres itself
AND nspname = 'schemaname';
这是更完整的,将显示所有现有模式,无论您是否可以访问该模式,而PostgreSQL本身没有创建。
来自http://www.postgresql.org/docs/9.1/static/infoschema-schemata.html(重点是我的):
视图schemata包含当前数据库中由当前启用的角色拥有的所有模式。
因此,您原始的解决方案/查询比Peter的更可靠,尽管不是标准的。
这个对我有效(Postgres 9.3):
Select exists (SELECT 1 FROM information_schema.schemata where catalog_name = 'My_BD_with_UpperCase_characters_in_its_Name')
有没有其他方法可以检查模式存在?
to_regnamespace ( text ) → regnamespace
select to_regnamespace('public') is not null;