mysql 出现错误 Duplicate entry for key PRIMARY 解决办法

本文介绍在MySQL中如何为已有表添加主键,并解决添加过程中遇到的重复键值错误。通过设置新增字段为自增(auto_increment),成功解决了在t111表中添加名为stu_id的主键字段的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原来是没有主键的,想增加一列为主键。

mysql> desc t111;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(24) | YES  |     | robert  |       |
| age   | int         | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

执行代码,结果报错:

mysql> alter table t111 add stu_id  tinyint primary key first;
ERROR 1062 (23000): Duplicate entry '0' for key 't111.PRIMARY'

解决办法,把它设置为自增auto_increment: 

mysql> alter table t111 add stu_id  int(4) primary key auto_increment first;
Query OK, 0 rows affected, 1 warning (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 1

 

### 解决 MySQL 错误 1062 主键 'PRIMARY' 重复条目 当尝试向数据库插入一条记录时,如果该记录的主键值已经存在于表中,则会触发错误 `ERROR 1062 (23000): Duplicate entry`。对于这种情况,有几种常见的解决方案。 #### 使用 INSERT ... ON DUPLICATE KEY UPDATE 一种优雅的方法是在遇到冲突时更新现有记录而不是抛出异常。语法如下: ```sql INSERT INTO table_name (column_list) VALUES (value_list) ON DUPLICATE KEY UPDATE column_name=VALUES(column_name); ``` 此命令允许指定哪些字段应该被更新,并且只会在发生唯一约束违反的情况下执行更新操作[^1]。 #### 替换插入 REPLACE INTO 或者使用 IGNORE 关键字 另一种方式是利用 `REPLACE INTO` 来替代普通的 `INSERT` 语句;它的工作原理是从目标表格删除任何与新行具有相同唯一关键字组合的老行并插入新的行。然而需要注意的是这种方法可能会破坏外键关系并且不是最佳实践。更推荐的做法是采用带有 `IGNORE` 的插入形式: ```sql INSERT IGNORE INTO table_name SET id='80', other_column='some_value'; ``` 这样可以忽略因主键或其他唯一索引引起的重复项而不会中断整个事务处理流程[^4]。 #### 数据清理和验证 在某些情况下,可能是由于应用程序逻辑缺陷导致试图插入已存在的ID。因此,在应用层面做适当的数据校验是非常重要的。另外也可以考虑定期运行脚本来查找并修正潜在的问题数据集,比如设置自增列作为主键来防止手动输入带来的风险[^2]。 #### 修改现有的主键策略 考虑到业务需求的变化,有时重新设计表结构也是必要的选项之一。例如将自然码改为代理键(surrogate key),即让系统自动分配唯一的标识符给每条记录从而规避人为因素造成的冲突可能性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发狂的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值