sql - 通过触发器更新另一个表,其中新值是 SELECT 查询的结果
问题描述
我有这些表:
- 用户
- 技能(名称- 字符串,计数- 整数)
- Has_skills ( Skill_id - Skills.id, user_id users.id)
Has_skills 是前两个之间的多对多表,通过这些 FK:user_id (users.id) 和 Skill_id (skills.id)。
我想要做的是在将新行插入has_skills时更新技能内的计数列。我想通过表has_skills上的更新触发器来做到这一点。我将通过选择查询获得 count 的新值:
SELECT COUNT(*) AS cnt FROM skills
JOIN has_skills hs ON skills.id = hs.skill_id
WHERE hs.skill_id = 1;
上面的 ID 是硬编码的 (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;
扳机:
CREATE TRIGGER on_has_skills_insert
AFTER INSERT ON has_skills
FOR EACH ROW
EXECUTE PROCEDURE update_skill_count();
我成功创建了函数和触发器,但是当我将新数据插入has_skills时,它不会更改Skills中的计数列。可能是什么问题呢?
解决方案
触发器功能中根本不需要选择。技能表的键直接在 new.skill_id 中可用,所以直接使用它:
-- trigger function and trigger
create or replace function update_skill_count()
returns trigger
as $func$
begin
update skills sk
set count = count+1
where sk.skill_id = new.skill_id;
return new;
end;
$func$ language plpgsql;
create trigger on_has_skills_insert
after insert on has_skills
for each row
execute procedure update_skill_count();
推荐阅读
- docker - 使用 docker 时,我应该将 bash 设置文件放在哪里?
- javascript - Javascript-我如何从 ajax responsetext 中提取日期时间
- javascript - 羽毛笔工具栏按钮在 Laravel 中不起作用
- python - 创建新对象时可以使用列表作为属性吗?
- swift - 如何删除具有特定名称 spritekit 的所有节点
- numpy - 如何在 n 行后将值添加到新列?
- python - Pyinstaller:subprocess.check_output 在 noconsole 模式下给出错误
- jquery - 根据具有特定键值的对象过滤和附加 AJAX JSON 结果
- python - '\n' 和 'None' 出现在控制台输出列表的末尾。如何删除它们?
- php - 显示类别?