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 14:30:54 浏览: 156
这是一条 PostgreSQL 数据库查询语句,用于查找指定 schema(在此为 public)下的所有表名,并排除继承关系的表。其具体作用如下:
1. 通过 `pg_tables` 系统目录表,筛选指定 schema(在此为 public)下的所有表名,使用 `schemaname` 和 `tablename` 进行筛选。
2. 使用子查询查找继承关系的表,即父表和子表,使用 `pg_inherits` 系统目录表来查找这个关系。通过 `inhparent` 和 `inhrelid` 可以找到父表和子表的 `oid`。然后使用 `pg_class` 系统目录表找到表的详细信息,包括表名和 schema。最后,使用 `pg_namespace` 系统目录表来查找 schema 的详细信息,并与表的详细信息一起使用以获取完整的表名。
3. 将不在子查询结果中的所有表名按照字母顺序排序,并返回结果。
该查询语句的作用是查找指定 schema 下的所有非继承关系的表名。在数据迁移过程中,可以使用此查询来列出需要进行数据清理和转换的表,以便执行后续的数据迁移操作。
相关问题
test=# SELECT * FROM pg_dump_catalog; 错误: 关系 "pg_dump_catalog" 不存在 第1行SELECT * FROM pg_dump_catalog;
如果在 Kingbase 数据库中,使用 `SELECT * FROM pg_dump_catalog;` 命令查询备份信息,提示表不存在,可能是因为该表没有被创建,或者是权限不足。
你可以使用以下命令来检查是否存在名为 pg_dump_catalog 的表:
```
SELECT tablename FROM pg_tables WHERE tablename = 'pg_dump_catalog';
```
如果该命令返回结果为空,则说明该表不存在。如果该表不存在,你需要先创建该表,再查询备份信息。
创建 pg_dump_catalog 表的命令如下:
```
CREATE TABLE pg_dump_catalog (dump_id serial primary key, dump_date timestamp default now(), dump_file text);
```
创建表后,你可以使用 pg_dump 工具或其他备份工具进行备份,并将备份信息插入到 pg_dump_catalog 表中,例如:
```
INSERT INTO pg_dump_catalog (dump_file) VALUES ('/backup/2022-01-01.dump');
```
之后,你就可以通过以下命令来查询备份信息:
```
SELECT * FROM pg_dump_catalog;
```
如果你仍然无法查看备份信息,可能是因为你没有足够的权限来查询该表。你可以检查当前用户的权限,或者使用超级用户登录数据库来查询备份信息。
Postgrepsql get_table_ddl(v_schemaname, v_tablename)语句
在PostgreSQL中,`get_table_ddl(v_schemaname, v_tablename)`是一个假设存在的函数,它主要用于获取指定模式(schemaname)和表名(tablename)的创建表DDL(Data Definition Language)语句。这个函数可能会通过查询系统的元数据(metadata)或者系统目录表来获取表的相关信息,如字段定义、索引、约束等,并将其组合成一个DDL字符串,返回给用户或用于备份恢复。
然而,PostgreSQL本身并没有直接提供这样的内置函数,你需要自定义或者使用第三方工具(如pg_dump、pg_statements等)来实现类似的功能。如果存在这样的函数,它的大概实现会像这样:
```sql
CREATE OR REPLACE FUNCTION get_table_ddl(text, text)
RETURNS text AS $$
BEGIN
RETURN format('CREATE TABLE %I.%I (%s);', v_schemaname, v_tablename, pg_get_tabledef(v_tablename, v_schemaname));
END;
$$ LANGUAGE plpgsql;
```
阅读全文