簡體   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