引用(物化)视图不起作用,触发器可能如下所示:
CREATE OR REPLACE FUNCTION reject_not_existing_id()
RETURNS "trigger" AS
$BODY$
BEGIN
IF NEW.product_no NOT IN (SELECT id FROM dup.freshProducts UNION SELECT id FROM dup.cannedProducts) THEN
RAISE EXCEPTION 'The product id % does not exist', NEW.product_no;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
CREATE TRIGGER tr_before_insert_or_update
BEFORE INSERT OR UPDATE OF product_no
ON orderLines
FOR EACH ROW
EXECUTE PROCEDURE reject_not_existing_id();
(另见http://www.tek-tips.com/viewthread.cfm?qid=1116256)
物化视图可能看起来不错,但失败的原因有两个: 就像视图一样,您根本无法引用它,因为它不是表(继续尝试)。假设您可以,仍然存在防止freshProducts 和cannedProducts 中的两个相同ID 的问题。是的,您可以在物化视图上定义一个 UNIQUE INDEX,但是如何确保在新鲜和罐头中都不会首先使用相同的 id?
如果使用orderLines 中的触发器,这仍然是您必须解决的问题。
这让我建议重新考虑您的模型。 'Fresh' 和 'canned' 也可能是单个表 products 的属性值,因此所有麻烦都是多余的。如果新鲜和罐装产品的属性(数量)显着不同(想不出任何其他原因来创建两个不同的表),则在另外两个表中引用产品 ID。喜欢
CREATE TABLE products
(
id ... PRIMARY KEY
, fresh_or_canned ...
, price ...
, another_common_attribute_1 ...
, ...
, another_common_attribute_n ...
);
CREATE TABLE canned_specific_data
(
canned_id ... REFERENCES products (id)
, type_of_can ...
, ...
, another_attribute_that_does_not_apply_to_fresh ...
);
CREATE TABLE fresh_specific_data
(
fresh_id ... REFERENCES products (id)
, date_of_harvest ...
, ...
, another_attribute_that_does_not_apply_to_canned ...
);