У меня есть эти таблицы:
- Пользователи
- Навыки ( имя - строка, количество - целое число)
- Has_skills ( skill_id - skill.id, user_id users.id)
Has_skills - таблица «многие ко многим» между первыми двумя через эти FK:
user_id (users.id) и skill_id (skill.id).
Я хочу обновить столбец count внутри skill , когда новая строка вставлена в has_skills . Я хочу сделать это через триггер обновления для таблицы has_skills . Новое значение для количества я получу через запрос выбора:
SELECT COUNT(*) AS cnt FROM skills
JOIN has_skills hs ON skills.id = hs.skill_id
WHERE hs.skill_id = 1;
Идентификатор выше жестко закодирован (1), но он работает.
Я также тестировал этот код изолированно, и он работает (хотя и жестко закодировано):
UPDATE skills
SET count = subquery.cnt
FROM (
SELECT COUNT(*) AS cnt FROM skills
JOIN has_skills hs ON skills.id = hs.skill_id
WHERE hs.skill_id = 1
) AS subquery
WHERE skills.id = 1;
RETURN NEW;
Хорошо, так вот, вероятно, где проблема. Ниже представлена функция триггера, а также сам триггер.
Функция:
CREATE OR REPLACE FUNCTION update_skill_count() RETURNS trigger AS
$func$
BEGIN
UPDATE skills
SET count = subquery.cnt
FROM (
SELECT COUNT(*) AS cnt FROM skills
JOIN has_skills hs ON skills.id = hs.skill_id
WHERE hs.skill_id = NEW.skill_id
) AS subquery
WHERE skills.id = NEW.skill_id;
RETURN NEW;
END;
$func$ LANGUAGE plpgsql;
Trigger:
CREATE TRIGGER on_has_skills_insert
AFTER INSERT ON has_skills
FOR EACH ROW
EXECUTE PROCEDURE update_skill_count();
Я успешно создал функцию и триггер, но когда я вставляю новые данные в has_skills , он не меняет столбец count внутри skill . В чем может быть проблема?