我希望在插入新行时将主键列的值从父表传播到特定的子表。
为了便于说明,我创建了以下表格:
Create TABLE Material(
MatID serial PRIMARY KEY,
materialname TEXT
);
Create TABLE RealMaterial(
MatID INT REFERENCES Material(MatID),
attributereal TEXT,
PRIMARY KEY(MatID)
);
Create TABLE VirtualMaterial(
MatID INT REFERENCES Material(MatID),
attributevirt TEXT,
PRIMARY KEY(MatID)
);
当我插入新材料时,我自动想要添加RealMaterial
或VirtualMaterial
(引用新ID)。我应该强调我想使用这个共享主键模式,而不仅仅是单表继承。
我应该为我的目的使用触发器吗?
答案 0 :(得分:1)
从您的评论中,您似乎并不真正关心"自动插入",而是"自动执行"儿童的存在 1 和排他性 2 。
由于PostgreSQL支持延迟约束,因此可以声明性地like this进行。
然而,它需要" uglyfying"您的模型通常会增加复杂性,因此在应用程序级别强制执行此类约束通常被视为较小的恶意。你可以考虑隐藏这种逻辑behind an API,以消除" rogue"客户绕过它。
1 对于给定的父行,必须有子行。换句话说,单独的父类无法实例化 - 它是抽象的。
2 对于给定的父行,不能有多个子行。
答案 1 :(得分:0)
我真的不明白你所有的字段是什么意思,你并没有真正提供大量的信息,但你可以用触发器完成这个。同样,这里没有很多信息,所以我不会尝试编写一个有效的例子,但伪代码片段将是:
IF (TG_OP = 'INSERT') THEN
IF NEW.Parameter = 'REAL' THEN
INSERT INTO RealMaterial (MatID) VALUES (NEW.MatID);
ELSE
INSERT INTO VirtualMaterial (MatID) VALUES (NEW.MatID);
END IF;
END IF;
我不知道Material.Parameter与Parameter2和Parameter3之间的关系(如果有的话)。假设Material.Parameter控制材质是真实的还是虚拟的,那么您将需要处理INSERTS和UPDATES,并能够将材料从“RealMaterial”移动到“VirtualMaterial”,反之亦然。您可以使用外键(级联)处理删除。
两条未经请求的建议: