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
相关产品推荐
相关产品推荐

