INSERT...回..带上空时之前取消触发的声明
-
21-12-2019 - |
题
我有一个PostgreSQL之前插入触发器上创建的,基本上重插入子表格。一旦我入记录,我想到中止的请求,以避免重复的数据(不插入父母表),所以我使用return NULL在的触发器。问题是我需要的记录可以返回的,所以我能获得身份证。如果我回NULL,我得到空。
上述问题的讨论在以下链接:PostgreSQL触发不回任何东西
一个答复说,插入父母表(通过不返回null但返回新)和使用之后插入触发删除它从父母表。但我看着1000写每第二,这可能是一个严重的问题,在性能,因为该删除。是否有任何其他方式做到这一点?
确切的说是没有一种方法返回的id插行中没有插入父母表,并删除它。
解决方案
我写了 答案你是指.正如我已经暗示过:
你也可以使用
RULE ... INSTEAD ..
用于这一目的。
RULE
规则 可能是棘手的。我宁愿使用的触发器在可能的情况。 一定要读一点, 之前,您试试这个:
CREATE OR REPLACE RULE tbl_ins AS
ON INSERT TO tbl
DO INSTEAD
INSERT INTO tbl2 (col1, col2, ...) -- just do mention columns where ...
VALUES (NEW.col1, NEW.col2, ...) -- ... you want to insert column defaults
RETURNING tbl2.*
这将返回值 tbl2
同时避免幻行。 然而, 每文件 CREATE RULE
:
在一个规则
INSERT
,UPDATE
, 或DELETE
上一个看,你可以添加一个RETURNING
条款发出的查看是列。这一条款将 用于计算产出如果该规则被触发时通过一个INSERT RETURNING
,UPDATE RETURNING
, 或DELETE RETURNING
命令分别进行。规则时被触发时通过一个指令没有RETURNING
, 该规则的RETURNING
条款将被忽略。 目前实行的允许 只有无条件的INSTEAD
规则包含RETURNING
;
大胆的重点矿山。
因为你说 sub-tables
, 我想你会需要的条件分发的刀片...
currval()
/ lastval()
如果你经营一个触发器 FOR EACH ROW
你可以很容易地获取适当值序列 currval()
/ lastval()
.最棘手的部分要返回的那些价值从一个触发功能。我只能想写的临时表格。需要点思考时来创建和时下降一个...
我可能会 重新考虑整个方法 和重新定向的数据多 INSERT
报表的实际目标表...