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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:45:37