select tablename from pg_tables where schemaname='public' and tablename not in (SELECT child.relname AS child_table FROM pg_inherits JOIN pg_class parent ON pg_inherits.inhparent = parent.oid JOIN pg_class child ON pg_inherits.inhrelid = child.oid JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace) order by 1;
时间: 2024-04-05 20:30:54 浏览: 187
这是一条 PostgreSQL 数据库查询语句,用于查找指定 schema(在此为 public)下的所有表名,并排除继承关系的表。其具体作用如下:
1. 通过 `pg_tables` 系统目录表,筛选指定 schema(在此为 public)下的所有表名,使用 `schemaname` 和 `tablename` 进行筛选。
2. 使用子查询查找继承关系的表,即父表和子表,使用 `pg_inherits` 系统目录表来查找这个关系。通过 `inhparent` 和 `inhrelid` 可以找到父表和子表的 `oid`。然后使用 `pg_class` 系统目录表找到表的详细信息,包括表名和 schema。最后,使用 `pg_namespace` 系统目录表来查找 schema 的详细信息,并与表的详细信息一起使用以获取完整的表名。
3. 将不在子查询结果中的所有表名按照字母顺序排序,并返回结果。
该查询语句的作用是查找指定 schema 下的所有非继承关系的表名。在数据迁移过程中,可以使用此查询来列出需要进行数据清理和转换的表,以便执行后续的数据迁移操作。
相关问题
pg库查表ddl
### 查看 PostgreSQL 表的 DDL 方法
在 PostgreSQL 中,可以通过多种方式获取表的 DDL 语句。以下是几种常见的方法:
#### 使用 `pg_dump` 工具
`pg_dump` 是 PostgreSQL 提供的一个备份工具,可以用来导出单个表或整个 schema 的 DDL 和数据。通过指定参数 `-t` 来限定目标表,并使用 `--schema-only` 参数仅导出结构而不包含数据。
命令如下:
```bash
pg_dump --schema-only -t schemaname.tablename dbname
```
此方法适用于需要快速生成特定表的完整 DDL 场景[^1]。
#### 调用内置视图和函数
PostgreSQL 内置了一些元数据查询功能,可以直接从系统目录中提取表的定义信息。例如,利用 `information_schema.columns` 或者更底层的 `pg_class`, `pg_attribute` 等系统表来构建自定义查询。
然而,为了简化操作,通常会编写专用函数完成这一任务。例如,在引用材料中有提到一种实现方案——即创建名为 `get_table_ddl` 的函数[^3]:
#### 自定义函数示例
以下是一个用于返回给定表 DDL 定义的 PL/pgSQL 函数实例:
```sql
CREATE OR REPLACE FUNCTION get_table_ddl(
v_schemaname TEXT,
v_tablename TEXT
) RETURNS TEXT AS $$
DECLARE
ddl_sql TEXT;
BEGIN
SELECT string_agg(pg_get_viewdef(c.oid), E'\n')
INTO ddl_sql
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = v_schemaname AND c.relname = v_tablename;
IF ddl_sql IS NULL THEN
SELECT pg_getddlschema(n.nspname || '.' || c.relname)
INTO ddl_sql
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = v_schemaname AND c.relname = v_tablename;
END IF;
RETURN ddl_sql;
END $$ LANGUAGE plpgsql;
```
调用该函数即可获得所需表的具体 DDL 语句:
```sql
SELECT get_table_ddl('public', 'mytable');
```
这种方法的优势在于灵活性高,能够针对不同需求调整逻辑。
#### 动态 SQL 执行
如果希望进一步增强自动化程度,则可考虑采用动态 SQL 技术。这允许程序运行期间拼接并执行复杂的查询字符串。具体做法参见官方文档关于字符串处理函数的部分说明[^2]。
---
### 总结
综上所述,无论是借助外部实用程序还是内部脚本开发,均能有效达成检索 PostgreSQL 数据库对象定义的目标。推荐根据实际应用场景选取最合适的手段实施。
阅读全文
相关推荐
















