[英]PostgreSQL Function/Trigger assign same ID for every row per call
每次更新父表时,我都想插入到子表中。 但是当发生这种情况时,所有插入到子表中的新记录都应该具有相同的 id。 如果父表在另一次单独更新时,ids 只会增加。 我怎样才能做到这一点?
在这种情况下,我想在更新父表时将每个新的 My_Date 字段插入到子表中。 下面是一个示例。
当父表获得两个新行时...
My_Date
old
old
new
new
子表获得两个新行,都分配给相同的 ID(表定义中的 ID 自动递增)
My_Date ID
...
new 4
new 4
当父表再次获得两个新行时......
My_Date
old
old
old
old
new
new
子表获得两个新行,都分配给相同的新 ID
My_Date ID
...
old 4
old 4
new 5
new 5
这是我到目前为止所拥有的。
CREATE or replace FUNCTION update_child() RETURNS trigger AS
$BODY$
BEGIN
INSERT INTO child
SET My_Date = NEW.My_Date /*Not sure if this is correct*/
/*Give every row the same ID*/
RETURN NEW;
END
$BODY$
LANGUAGE plpgsql;
CREATE TRIGGER update_child_after_update
AFTER UPDATE
ON parent
FOR EACH ROW
EXECUTE PROCEDURE update_child();
我相信您想要的是序列和语句级(而不是行级)触发器的组合:
PostgreSQL 同时提供每行触发器和每语句触发器。 对于每行触发器,触发器 function 会为受触发触发器的语句影响的每一行调用一次。 相反,每条语句触发器只在执行适当的语句时调用一次,而不管该语句影响的行数。 特别是,影响零行的语句仍将导致执行任何适用的每语句触发器。 这两类触发器有时分别称为行级触发器和语句级触发器。
这真的很简单,但我认为它将展示您在问题中描述的所需行为。
create sequence child_id;
CREATE or replace FUNCTION update_child()
RETURNS trigger AS
$BODY$
DECLARE
r1 record;
new_id int;
BEGIN
new_id := nextval ('child_id');
FOR r1 IN SELECT * FROM new_table
LOOP
insert into child
select r1.my_date, new_id;
END loop;
RETURN NEW;
END
$BODY$
LANGUAGE plpgsql;
CREATE TRIGGER update_child_after_update
AFTER UPDATE
ON parent
REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table
FOR EACH statement
EXECUTE PROCEDURE update_child();
CREATE TRIGGER update_child_after_insert
AFTER INSERT
ON parent
REFERENCING NEW TABLE AS new_table
FOR EACH statement
EXECUTE PROCEDURE update_child();
语句级触发器有很多限制,值得一读。 例如,仅支持“after”。
大概您的父表也有某种形式的 PK,您也可以将其传递给子表,但我希望这很容易看出您将在上面的代码示例中将其插入何处。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.