Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL:外键/删除级联/触发器_Postgresql_Constraints - Fatal编程技术网

PostgreSQL:外键/删除级联/触发器

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

我有三张桌子:

细部

资料室档案

交易结果

Transaction_Results是一个我没有构建的新表,它有一个约束,我可能会完全删除它,但我相信它可能会破坏一些我认为它是为之构建的函数

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”中结束,或者如何找到设计器以知道哪一个是合适的。