SQL插入数据时如何保障同一user_id与event_id组合仅存在一条记录
最优实现方案
1 底层兜底:给表加联合唯一约束
这是最稳妥的方案,从数据库层面直接禁止event_id和user_id的重复组合写入,哪怕上层业务逻辑出问题也不会产生脏数据,完全符合你要求的「事件关联后用户画像不允许变更」的规则。
建约束的SQL如下:
ALTER TABLE [你的表名] ADD UNIQUE KEY `uk_event_user` (`event_id`, `user_id`);
如果表里已经有重复数据,先执行去重SQL再建约束:
-- 保留id更小的一条记录,删除其余重复项,可根据需求调整保留规则 DELETE t1 FROM [你的表名] t1 JOIN [你的表名] t2 ON t1.event_id = t2.event_id AND t1.user_id = t2.user_id WHERE t1.id > t2.id;
2 写入SQL适配
配合唯一约束,有两种常用的写入写法,重复写入时不会抛出错误,自动跳过已存在的组合:
方案A:INSERT IGNORE(推荐)
性能最优,写法简单,重复数据直接忽略,不会修改已有记录:
INSERT IGNORE INTO [你的表名] (event_id, user_id, age, gender) SELECT event_id, user_id, age, gender FROM [你的数据源表/子查询];
方案B:NOT EXISTS 写法
如果暂时不便修改表结构加约束,可以用这种纯SQL判断的方式写入,仅适合低并发小批量场景:
INSERT INTO [你的表名] (event_id, user_id, age, gender) SELECT src.event_id, src.user_id, src.age, src.gender FROM [你的数据源表/子查询] src WHERE NOT EXISTS ( SELECT 1 FROM [你的表名] target WHERE target.event_id = src.event_id AND target.user_id = src.user_id );
注意:纯NOT EXISTS写法在高并发写入场景下,仍然有概率出现重复数据,优先推荐「加唯一约束+INSERT IGNORE」的组合方案。
内容的提问来源于stack exchange,提问作者sanyamjain
相关产品推荐
相关产品推荐

