PostgresSQL: обновить определенный столбец в таблице B после обновления определенного столбца в таблице B - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть 2 таблицы в Postgres, скажем, Category и Thread с отношением один-ко-многим

Category

id   | title | created_at | deleted_at 
-----+-------+------------+-----------

Thread

id   | category_id | title | created_at | deleted_at 
-----+-------------+-------+------------+-----------

Я хочу создать триггер: если я произвожу мягкое удаление в Category (обновите deleted_at с нуля до настоящего момента ()), то Thread. deleted_at также будет обновлено.

Вот моя функция

    CREATE OR REPLACE FUNCTION "thread_soft_delete"()
    RETURNS trigger
    AS $pg1$
    BEGIN
    UPDATE thread SET deleted_at = NOW()
    FROM "category"
    WHERE thread.category_id = "category".id;
    RETURN NULL;
    END;
    $pg1$
    VOLATILE
    LANGUAGE plpgsql;

А вот триггер

    CREATE TRIGGER category_delete
    AFTER UPDATE ON "category"
    FOR EACH ROW
    WHEN (OLD.deleted_at IS DISTINCT FROM NEW.deleted_at)
    EXECUTE PROCEDURE thread_soft_delete();

Когда я запускаю update "category" set deleted_at = now() WHERE id = 1;, все столбцы created_at в thread обновляются. Я ожидаю, что только строки с category_id = 1 будут обновляться.

Пожалуйста, помогите мне

1 Ответ

0 голосов
/ 09 ноября 2018

Вам не нужно ссылаться на таблицу category в функции триггера. Просто NEW.id() должно быть в порядке.

CREATE OR REPLACE FUNCTION "thread_soft_delete"()
RETURNS trigger
AS $pg1$
BEGIN
UPDATE thread SET deleted_at = NOW()
WHERE thread.category_id = NEW.id;
RETURN NULL;
END;
$pg1$
VOLATILE
LANGUAGE plpgsql;
...