当从另一个表中删除时,如何使PostgreSQL将一行插入到表中?
我们有一个应用程序,它将根据用户请求从表中删除一行.我无法更改应用程序代码.但是,我想根据正在删除的行的信息,将一行插入到另一个表(有点像日志日志)中,其中包含几个其他表的信息.
如何在PostgreSQL中实现这一点?
写一个触发功能.这样的东西
CREATE OR REPLACE FUNCTION trg_backup_row() RETURNS trigger AS $BODY$ BEGIN INSERT INTO other_tbl SELECT (OLD).*,t.other_col -- all columns of from old table -- SELECT OLD.col1,OLD.col2,t.other_col -- alternative: some cols from old tbl FROM third_tbl t WHERE t.col = OLD.col -- link to third table with info from deleted row AND <unique_condition_to_avoid_multiple_rows_if_needed>; RETURN NULL; END; $BODY$ LANGUAGE plpgsql VOLATILE; 和一个触发器删除.喜欢这个: CREATE TRIGGER delaft AFTER DELETE ON tbl FOR EACH ROW EXECUTE PROCEDURE trg_backup_row(); 关键要素 最好让它成为trigger INSERT INTO other_tbl VALUES((OLD).*,some_variable) >您可以包括任何其他表格中的值,如我所示.只需确保获得单个行,或者创建多个条目. 关于知名度 回应@ couling的注意的评论. 虽然外键可以是declared as 因此,如果要在INSERT中包含来自行的值,请确保在删除这些行之前调用此触发器. 您可能必须在删除之前使此触发器. 或者这可能意味着您必须相应地订购您的触发器,BEFORE触发器来自AFTER触发器之前,显然.同级别的触发器在alphabetical order执行. 但是,只要我在这里非常精确,我还可以补充说,在其他BEFORE触发器中对行(或依赖行)所做的更改也只有在这个触发器之前被调用时才可见. 我建议将其做为AFTER触发器是因为如果其他触发器可能会通过操作取消(回滚)DELETE一半,那么它不太容易出现并发症,而且更便宜 – 只要以上不适用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |