PostgreSQL:外键/删除级联/触发器
我有三张桌子: 细部 资料室档案 交易结果 Transaction_Results是一个我没有构建的新表,它有一个约束,我可能会完全删除它,但我相信它可能会破坏一些我认为它是为之构建的函数PostgreSQL:外键/删除级联/触发器,postgresql,constraints,Postgresql,Constraints,我有三张桌子: 细部 资料室档案 交易结果 Transaction_Results是一个我没有构建的新表,它有一个约束,我可能会完全删除它,但我相信它可能会破坏一些我认为它是为之构建的函数 ALTER TABLE Transaction_Results ADD Constraint Transaction_Results_Detail_DetailID_fkey FOREIGN KEY (DetailID) REFERENCES Details (DetailID) MATCH SIMPLE O
ALTER TABLE Transaction_Results
ADD Constraint Transaction_Results_Detail_DetailID_fkey FOREIGN KEY (DetailID)
REFERENCES Details (DetailID) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
现在在过去,我只是简单地复制和删除记录的细节,并进入细节档案
保持约束的最常见方式是什么?
我的想法是:可能使其可以为null,并将我删除的值设置为null,可能将它们移动到引用表的存档版本的另一列,并使该列也可以为null。在我需要这个的代码中,我必须处理这个问题,但这对我来说并不坏。所以我采用了暴力方法
ALTER TABLE Transaction_Results DROP CONSTRAINT Transaction_Results_Detail_DetailID_fkey ;
ALTER TABLE Transaction_Results ALTER COLUMN DetailID DROP NOT NULL;
ALTER TABLE Transaction_Results ADD COLUMN DetailID_Archive integer NULL;
CREATE OR REPLACE FUNCTION process_Detail_delete() RETURNS TRIGGER AS $Transaction_Results_trigger$
BEGIN
--
-- Update a row in Transaction_Results to reflect the delete performed on Detail,
-- make use of the special variable TG_OP to work out the operation.
--
IF (TG_OP = 'DELETE') THEN
UPDATE Transaction_Results SET DetailID = NULL, DetailID_Archive = OLD.DetailID where DetailID = OLD.DetailID ;
RETURN OLD;
END IF;
RETURN NULL; -- result is ignored since this is an AFTER trigger
END;
$Transaction_Results_trigger$ LANGUAGE plpgsql;
CREATE TRIGGER Transaction_Results_trigger
AFTER DELETE ON [Detail]
FOR EACH ROW EXECUTE PROCEDURE process_Detail_delete();
这是一个外键,它确保对于该表中每个DetailID值,Details表中都有一条具有相同DetailID值的记录。对这是我的问题……显然(可能是错误的)答案是停止删除“细节”或“细节”中的行。这似乎就是“交易结果”的设计初衷。最简单的修复方法是在delete cascade上删除约束或使其成为
。您需要知道行如何在“Transaction_Results”中结束,或者如何找到设计器以知道哪一个是合适的。