PostgreSQL反向继承:如何从父表继承行至子模式表?
PostgreSQL利用表继承实现跨模式共享通用记录
看起来你已经找对了方向——用PostgreSQL的表继承特性来实现父模式存储通用记录,子模式表自动继承这些数据。我来帮你梳理下这个实现的细节、操作方式和需要注意的坑:
首先,你的基础创建语句是完全可行的,先把它贴出来方便参考:
CREATE SCHEMA parent; CREATE SCHEMA a; CREATE SCHEMA b; CREATE TABLE parent.component ( product_id serial PRIMARY KEY, title text ); CREATE TABLE a.component () INHERITS (parent.component); CREATE TABLE b.product () INHERITS (parent.component);
核心逻辑说明
parent.component作为共享父表,专门存储所有子模式都需要的通用记录,它是整个继承体系的数据源a.component和b.product作为子表,通过INHERITS关键字直接继承父表的字段结构和所有已存在(以及后续新增)的父表记录。这里注意下b.product表名是product,但继承了component的结构,如果你是特意这么设计的没问题,要是手滑写错了可以调整~
插入操作的两种场景
- 插入通用记录(所有子表共享)
直接往父表插入数据,这些记录会自动被所有子表"继承",也就是子表查询时能看到这些数据:
INSERT INTO parent.component (title) VALUES ('通用基础组件'), ('跨模式共享组件');
- 插入子模式专属记录
如果某个子模式需要自己独有的记录,直接插入到对应的子表即可,这些记录只会出现在该子表中,不会影响父表和其他子表:
-- 给A模式添加专属组件 INSERT INTO a.component (title) VALUES ('A业务线专属组件'); -- 给B模式添加专属产品 INSERT INTO b.product (title) VALUES ('B业务线专属定制产品');
查询时的注意事项
PostgreSQL的继承查询有几个细节要留意:
- 查询父表:默认只会返回父表自己的记录,如果要包含所有子表的记录,不要加
ONLY关键字:
-- 仅查询父表自身的通用记录 SELECT * FROM ONLY parent.component; -- 查询父表 + 所有子表的全部记录 SELECT * FROM parent.component;
- 查询子表:会自动返回子表自身的专属记录 + 父表的所有通用记录,这正是你想要的效果:
-- 结果是A模式专属组件 + 父表的通用组件 SELECT * FROM a.component;
容易踩的坑
- 主键不自动全局唯一:父表的主键约束只作用于父表本身,子表可以插入和父表
product_id重复的记录。如果需要全局唯一的ID,让子表复用父表的序列即可:
-- 创建子表时指定使用父表的序列 CREATE TABLE a.component ( product_id integer DEFAULT nextval('parent.component_product_id_seq'::regclass) ) INHERITS (parent.component);
- 索引、触发器、约束不继承:父表创建的索引、触发器、非主键约束不会自动应用到子表,需要你手动在子表上创建对应的结构。
- 删除父表要谨慎:如果删除父表,所有子表会变成独立的表,丢失继承关系,操作前一定要确认。
内容的提问来源于stack exchange,提问作者Faheem
相关产品推荐
相关产品推荐

