Создать триггер после УДАЛИТЬ и обновить выбранный оператор - PullRequest
1 голос
/ 16 апреля 2019

Я хочу создать триггер каждый раз, когда новая строка добавляется в ArrayA .

Это код, который я использовал:

CREATE TRIGGER increasement
    AFTER INSERT
    ON ArrayA
    FOR EACH ROW
    EXECUTE PROCEDURE func_increasement();

Добавлена ​​строка, и мне нужно обновить поле в ArrayB , но проблема в том, что: Мне нужно знать идентификатор новой строки, которая была добавлена, чтобы узнать, какую строку увеличить в ArrayB.

Вот что я пробовал:

CREATE OR REPLACE FUNCTION func_increasement()
    RETURNS trigger AS
$$
BEGIN
    IF (TG_OP = 'INSERT') THEN
        UPDATE ArrayB SET number = number + 1 
        WHERE ArrayB.id = ( SELECT ArrayA.arraya_id FROM ArrayA WHERE (SELECT COUNT(*) FROM ArrayA));
END;
$$ LANGUAGE plpgsql;

Это запрос, который я использовал для получения общего количества строк.

    Select Count(*) from ArrayA; 

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Полагаю, вам не понадобится условие, поскольку вы хотите запускать триггер только после события INSERT.Кроме того, начальное значение в таблице ArrayB должно быть либо равно 0 по умолчанию, либо во время обновления требуется значение COALESCE.Кроме того, триггер должен иметь оператор RETURN.Вы можете вернуть NEW или NULL для триггера AFTER, но произойдет сбой, если вы не используете ни один из них.

CREATE OR REPLACE FUNCTION func_increasement()
    RETURNS trigger AS
$$
BEGIN
        UPDATE ArrayB SET number = coalesce(number,0) + 1 
            WHERE ArrayB.id =  NEW.arraya_id;
      RETURN NEW;
END;
$$ LANGUAGE plpgsql;

DEMO

1 голос
/ 16 апреля 2019

Вы можете использовать NEW.id, который будет ссылаться на текущую добавленную строку в таблице ArrayA

Mysql сохраняет ссылку на вновь добавленную строку как NEW в случае запроса вставки.

...