Bin*_*gic 5 postgresql triggers plpgsql
我在创建时有一个PostgreSQL触发器,它基本上将插入重定向到子表.一旦我插入记录,我想要中止请求以避免重复数据.我知道的唯一方法就是返回NULL触发器.问题是我需要返回记录,以便我可以获取ID.如果我回来NULL,我得到... NULL.
任何想法我怎么能有一个触发器中止一个操作,同时仍然返回其他东西NULL?
你的问题留有解释空间.我理解它的方式,你希望命令的RETURNING子句INSERT返回序列生成的主键的值.
还有其他方法可以实现这一目标.就像使用事先从序列中nextval()获取下一个id并插入id拼出的行一样.
或currval()/ lastval()获取当前会话中序列/任何序列的最近获得的值.更多相关的答案:
PostgreSQL序列的下一个值?
你也可以用它RULE ... INSTEAD ..来达到这个目的.
但是,要回答你的问题 - 事实上,如果这是你的问题:它可以通过使用两个触发器来完成.一BEFORE,一AFTER INSERT.两者都是在每个定义的一个事务中触发,因此第一个表中的幻像行永远不会被任何人看到(触发器除外).
演示:
CREATE TABLE x (
id serial PRIMARY KEY -- note the serial col.
,name text
);
CREATE TABLE y (
id integer PRIMARY KEY
,name text
);
CREATE OR REPLACE FUNCTION trg_x_insbef()
RETURNS trigger AS
$func$
BEGIN
INSERT INTO y SELECT (NEW).*; -- write to other table
RETURN NEW;
END
$func$ LANGUAGE plpgsql;
CREATE TRIGGER insbef
BEFORE INSERT ON x
FOR EACH ROW EXECUTE PROCEDURE trg_x_insbef();
CREATE OR REPLACE FUNCTION trg_x_insaft()
RETURNS trigger AS
$func$
BEGIN
DELETE FROM x WHERE id = NEW.id; -- delete row again.
RETURN NULL;
END
$func$ LANGUAGE plpgsql;
CREATE TRIGGER insaft
AFTER INSERT ON x
FOR EACH ROW EXECUTE PROCEDURE trg_x_insaft();
Run Code Online (Sandbox Code Playgroud)
在psql中调用:
db=# INSERT INTO x (name) values('phantom') RETURNING id;
id
----
1
(1 row)
INSERT 0 1
db=# SELECT * FROM x;
id | name
----+------
(0 rows)
db=# SELECT * FROM y;
id | name
----+---------
1 | phantom
(1 row)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3729 次 |
| 最近记录: |