Postgresql

執行觸發器時將插入的行複製到新表中

  • October 25, 2019

我創建了 2 個這樣的表:

CREATE TABLE task
(
task_name TEXT NOT NULL,
duration INT,
UNIQUE(task_name)
);
CREATE TABLE temptable
(
task_name TEXT NOT NULL,
duration INT  NULL,

);

然後我在“任務”表中插入一行。

INSERT INTO public.task(
   task_name, duration)
   VALUES ('task1', 10);

每次我將新記錄添加到任務表中時,我都想在臨時表中插入一個新的同一行所以我創建了一個觸發器以同時在“temptale”中自動插入數據

CREATE OR REPLACE FUNCTION update_temptable()
RETURNS TRIGGER AS
$$
BEGIN
   -- insert temporary row
   INSERT INTO temptable(task_name, duration)
   SELECT NEW.task_name , NEW.duration FROM task;
  RETURN NEW;       
END
$$
LANGUAGE 'plpgsql';
/* Create trigger call function*/
CREATE TRIGGER ins_new_record
   AFTER INSERT ON task
   FOR EACH ROW
   EXECUTE PROCEDURE update_temptable();

但是當我將新行(’task 2’,10)插入’task’表時,插入’temptable’表的記錄總是像這樣重複。

task_name|duration|
|"task2" |10      |
-------------------

|"task2" |10      |

我不知道如何解決它。誰能幫我?謝謝。

觸發器中的語句:

INSERT INTO temptable
  (task_name, duration)
SELECT NEW.task_name , NEW.duration
FROM task;

將插入盡可能多的行temptabletask. 為 中的SELECT每一行返回一個結果行task,並且由於SELECT列表僅包含常量,所有這些結果行看起來都相同。

你想插入一行,所以你應該使用

INSERT INTO temptable
  (task_name, duration)
VALUES (NEW.task_name , NEW.duration);

引用自:https://dba.stackexchange.com/questions/251879