You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中如何从子表获取对应父表的名称

PostgreSQL中如何从子表获取对应父表的名称

这个问题在使用PostgreSQL表继承特性时很常见,我来给你几个实用的解决办法:

方法一:查询系统表pg_inherits

PostgreSQL会把表的继承关系存在系统表pg_inherits里,我们可以通过关联存储表元数据的pg_class表来获取父表名称:

SELECT pg_class.relname AS parent_table_name
FROM pg_inherits
JOIN pg_class ON pg_inherits.inhparent = pg_class.oid
WHERE inhrelid = 'Child'::regclass;

解释一下:

  • inhrelid = 'Child'::regclass 指定我们要查询的子表是Child,regclass类型会自动把表名转换成对应的OID,避免拼写问题。
  • inhparent是父表的OID,关联pg_class后就能通过relname拿到父表的名称。

如果需要在查询Child表数据的同时返回父表名,可以把这个查询和子表查询结合:

SELECT c.*, p.parent_table_name
FROM Child c
CROSS JOIN (
    SELECT pg_class.relname AS parent_table_name
    FROM pg_inherits
    JOIN pg_class ON pg_inherits.inhparent = pg_class.oid
    WHERE inhrelid = 'Child'::regclass
) p;

方法二:使用内置函数pg_get_parenttables

PostgreSQL提供了更简洁的内置函数pg_get_parenttables,它会返回给定表的所有父表(支持多继承),用unnest可以把数组结果转成单行:

SELECT unnest(pg_get_parenttables('Child')) AS parent_table_name;

这个方法代码更短,适合只需要父表名称的场景。

你的C++代码示例

对应到你的需求,你可以这样写:

// 用pg_get_parenttables的版本
std::string parent_name = db.exec("SELECT unnest(pg_get_parenttables('Child')) AS parent_table_name;").get(0, 0);

// 或者用系统表的版本
std::string parent_name = db.exec(R"(
    SELECT pg_class.relname AS parent_table_name
    FROM pg_inherits
    JOIN pg_class ON pg_inherits.inhparent = pg_class.oid
    WHERE inhrelid = 'Child'::regclass;
)").get(0, 0);

如果你的子表有多个父表(PostgreSQL支持多继承),上面的查询会返回所有父表名称,你可以根据需求处理(比如取第一个结果,或者遍历所有结果)。

备注:内容来源于stack exchange,提问作者Khalil Dhahbia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 10:38:03