You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Hasura PostgreSQL中配置单活跃行自动切换逻辑?

实现同一用户-标签组合仅一行激活的逻辑

针对你的需求,直接在PostgreSQL层面通过触发器+部分唯一约束实现最可靠,Hasura端无需额外复杂配置,具体步骤如下:

1. 创建触发器函数

先写一个PL/pgSQL函数,用来处理插入/更新时的自动置非激活逻辑:

CREATE OR REPLACE FUNCTION deactivate_old_active_rows()
RETURNS TRIGGER AS $$
BEGIN
    -- 只有当当前操作的行要设为激活状态时才执行逻辑
    IF NEW.is_active = TRUE THEN
        -- 把同用户同标签下其他激活的行设为非激活
        UPDATE your_table_name
        SET is_active = FALSE
        WHERE user_id = NEW.user_id
          AND tag_id = NEW.tag_id
          AND is_active = TRUE
          AND id != NEW.id; -- 排除当前正在操作的行
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

注意把代码里的your_table_name替换成你的实际表名。

2. 绑定触发器到表

创建触发器,监听表的插入和更新事件(仅当is_active/user_id/tag_id变化时触发,避免无效执行):

CREATE TRIGGER trigger_deactivate_old_active
AFTER INSERT OR UPDATE OF is_active, user_id, tag_id ON your_table_name
FOR EACH ROW
EXECUTE FUNCTION deactivate_old_active_rows();

3. 添加部分唯一约束(可选但推荐)

为了防止并发操作导致的数据冲突(比如同时插入两条同用户同标签的激活行),可以加一个部分唯一约束,强制同一组合下只能有一行激活状态:

ALTER TABLE your_table_name
ADD CONSTRAINT unique_active_user_tag UNIQUE (user_id, tag_id)
WHERE is_active = TRUE;

4. Hasura端确认配置

因为逻辑都在数据库层面实现,Hasura这边只要确保:

  • 连接数据库的用户有执行上述函数和触发器的权限(如果是创建表的用户,默认权限足够)
  • 你在Hasura中定义的INSERT/UPDATE突变可以正常执行,数据库会自动触发逻辑,不需要修改突变的定义

内容的提问来源于stack exchange,提问作者Marcus Rohden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:33:38