Как сделать запрос, который, при добавлении данных в одну таблицу, добавлял данные в другую?

У меня есть две таблицы: первая таблица вторая таблица

Мне нужно написать тригер, которая при добавлении данных в таблицу с stage_id и name_of_stage (stages), он добавит данные и в таблицу с number_point, stage_id, point_name (points). Например, если я в stages добавляю данные (4, 'текст'), то в таблице points появятся (6, 4, 'ещё другой текст').

Мой код:

КОД


Ответы (1 шт):

Автор решения: pegoopik

Добро пожаловать! :-)

В таком виде триггер бессмысленный, но как я понял вам просто нужен рабочий пример. Тогда примерно так:

CREATE OR REPLACE FUNCTION after_insert_stage()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO points(number_point, stage_id, point_name)
  SELECT COALESCE((SELECT MAX(number_point) + 1 FROM points), 1),
    NEW.stage_id, 'tmp_name';
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE TRIGGER after_insert_stage AFTER INSERT ON stages FOR EACH ROW
EXECUTE FUNCTION after_insert_stage();

TRUNCATE TABLE points;
TRUNCATE TABLE stages;

INSERT INTO stages(stage_id, name_of_stage) VALUES(1,'111');
INSERT INTO stages(stage_id, name_of_stage) VALUES(2,'222');
INSERT INTO stages(stage_id, name_of_stage) VALUES(3,'333');

SELECT p.*, s.name_of_stage
FROM stages s
  JOIN points p ON s.stage_id = p.stage_id;

Результат примерно такой:

"number_point" "stage_id" "point_name" "name_of_stage"
1               1         "tmp_name"    "111"
2               2         "tmp_name"    "222"
3               3         "tmp_name"    "333"

ОБратите внимание на COALESCE((SELECT MAX(number_point) + 1 FROM points), 1) в триггерной функции, без COALESCE у вас все значения stage_id в таблице points будут NULL, когда начнёте заполнять пустую БД.

Собственно в вашем варианте ошибка была в том, что вы находили значение stage_id как максимальный из таблицы stages + 1. Но по-скольку, триггер выполняется после INSERT, максимальное значение в таблице после операции INSERT...VALUES(4, 'gg') - будет равно 4, а добавив 1 поучим 5. Правильней использовать ключевое слово NEW в теле триггерной функции. Как в примере. Так же рекомендую в целом ознакомиться с тем, что такое триггер, кратко хотя бы тут: https://postgrespro.ru/docs/postgrespro/9.6/plpgsql-trigger

→ Ссылка