确定 PostgreSQL 架构中的表是否存在
PostgreSQL 数据库经常使用模式,包括公共模式和不同组织的自定义模式。 这就需要可靠的方法来确认特定模式中表的存在。
信息模式的局限性
虽然信息模式提供了数据库表的视图,但它仅限于当前用户可以访问的表。 此限制可能会产生漏报。 以下使用信息模式的查询可能无法准确反映表的存在:
<code class="language-sql">SELECT EXISTS ( SELECT FROM information_schema.tables WHERE table_schema = 'schema_name' AND table_name = 'table_name' );</code>
使用系统目录的可靠方法
要进行更全面的检查,请利用 PostgreSQL 的系统目录。 下面的查询使用 pg_class
和 pg_namespace
可靠地确定表是否存在,无论用户权限如何:
<code class="language-sql">SELECT EXISTS ( SELECT FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = 'schema_name' AND c.relname = 'table_name' AND c.relkind = 'r' -- only tables );</code>
如果表存在,则此查询返回true
。
用于表存在验证的类型转换
另一种技术涉及将表标识符转换为 regclass
类型。 成功的转换意味着该表的存在;失败会导致异常。
<code class="language-sql">SELECT 'schema_name.table_name'::regclass;</code>
使用 to_regclass
(PostgreSQL 9.4 及更高版本)
对于 PostgreSQL 9.4 及后续版本,to_regclass
函数提供了更健壮的解决方案。 如果表不存在,则返回 NULL
,避免异常:
<code class="language-sql">SELECT to_regclass('schema_name.table_name');</code>
以上是如何可靠地检查特定 PostgreSQL 模式中表是否存在?的详细内容。更多信息请关注PHP中文网其他相关文章!