如何在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
相关产品推荐
相关产品推荐

