繁体   English   中英

PostgreSQL 函数/触发器为每次调用的每一行分配相同的 ID

[英]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(); 

我相信您想要的是序列和语句级(而不是行级)触发器的组合:

https://www.postgresql.org/docs/current/trigger-definition.html#:~:text=PostgreSQL%20offers%20both%20per%2Drow,statement%20that%20fired%20the%20trigger

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM