[英]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.