MySQL表主键操作异常:删主键失败,加主键提示重复如何解决?
问题解决方案
1. 先解决user_id重复问题
报错Duplicate entry '1' for key 'sessions.PRIMARY'说明存在多条相同user_id的记录,user_id不具备唯一性,无法单独作为主键。根据业务需求二选一:
方案A:清理重复记录(保留每个用户一条session)
如果业务允许每个用户只留一条session,执行以下SQL清理冗余数据:
-- 创建临时表存储需保留的记录主键 CREATE TABLE temp_sessions AS SELECT hash, user_id FROM sessions GROUP BY user_id; -- 删除不在临时表中的重复记录 DELETE s FROM sessions s LEFT JOIN temp_sessions t ON s.hash = t.hash AND s.user_id = t.user_id WHERE t.hash IS NULL; -- 清理临时表 DROP TABLE temp_sessions;
方案B:调整主键策略(保留多session记录)
如果业务需要一个用户对应多条session,不能用user_id单独做主键,可选择:
- 维持原复合主键(
hash,user_id) - 新增自增主键,同时给
user_id加索引提升查询效率:ALTER TABLE sessions ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY FIRST; CREATE INDEX idx_sessions_user_id ON sessions(user_id);
2. 针对PlanetScale/Vitess环境的主键变更操作
从报错中的vttablet和planetscale-admin可知你使用的是PlanetScale(基于Vitess),Vitess不允许表临时处于无主键状态,因此不能分开执行drop primary key和add primary key,需合并为一条DDL语句一次性完成替换:
ALTER TABLE sessions DROP PRIMARY KEY, ADD PRIMARY KEY (user_id);
3. 验证结果
执行完上述操作后,查询表结构确认主键变更成功:
DESCRIBE sessions;
内容的提问来源于stack exchange,提问作者reactor
相关产品推荐
相关产品推荐

