← 返回错误码列表

MySQL错误码 1062 分析与解决方案

错误信息

Error 1062

重复条目。检查唯一约束或主键。

你的PHP应用在使用PDO连接MySQL时遇到了重复键错误:

'pdo_code' => '23000',
'db_code' => 1062,
'db_error' => 'Duplicate entry 'value' for key 'key_name''

解决方案

  • 使用INSERT IGNORE忽略重复记录
  • 使用REPLACE INTO替换重复记录
  • 使用ON DUPLICATE KEY UPDATE更新重复记录
  • 在插入前检查记录是否存在
  • 使用UPSERT操作(MySQL 8.0+)
  • 调整业务逻辑避免重复插入

PHP处理重复键示例代码

// 方法1: 使用INSERT IGNORE
$sql = "INSERT IGNORE INTO users (username, email) VALUES (?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$username, $email]);
$affectedRows = $stmt->rowCount();

// 方法2: 使用ON DUPLICATE KEY UPDATE
$sql = "INSERT INTO users (username, email, last_login) "
        . "VALUES (?, ?, NOW()) "
        . "ON DUPLICATE KEY UPDATE last_login = NOW()";
$stmt = $pdo->prepare($sql);
$stmt->execute([$username, $email]);

// 方法3: 先检查后插入
$checkSql = "SELECT COUNT(*) FROM users WHERE username = ?";
$checkStmt = $pdo->prepare($checkSql);
$checkStmt->execute([$username]);
$exists = $checkStmt->fetchColumn() > 0;

if (!$exists) {
  $insertSql = "INSERT INTO users (username, email) VALUES (?, ?)";
  $insertStmt = $pdo->prepare($insertSql);
  $insertStmt->execute([$username, $email]);
} else {
  // 处理重复记录的逻辑
  error_log("用户 {$username} 已存在");
}

重复键错误模拟演示

重复键错误发生在尝试插入违反唯一约束的数据时:

表结构

用户表有唯一索引:username

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(50) UNIQUE,
  email VARCHAR(100)
);

第一次插入

INSERT INTO users (username, email) VALUES ('john_doe', 'john@example.com')

成功

第二次插入相同用户名

INSERT INTO users (username, email) VALUES ('john_doe', 'john2@example.com')

Error 1062: Duplicate entry 'john_doe' for key 'username'

预防措施

1. 应用层优化

  • 在插入前进行数据验证
  • 实现适当的重试机制
  • 使用合适的INSERT语句变体
  • 记录重复插入尝试

2. 数据库层优化

  • 合理设计唯一约束和索引
  • 使用复合唯一键避免不必要的约束
  • 考虑使用UUID代替自增ID作为业务键
  • 定期清理重复数据

3. 架构层优化

  • 实现分布式锁机制
  • 使用消息队列处理高并发插入
  • 考虑使用Redis等缓存层进行预检查
  • 实施数据去重策略

调试工具

使用以下MySQL命令分析重复键错误:

# 查看表的索引信息
SHOW INDEX FROM table_name;

# 查看重复的数据
SELECT username, COUNT(*) as count
FROM users
GROUP BY username
HAVING count > 1;

错误分析要点

错误消息会显示:

  • 重复的值是什么
  • 违反的是哪个唯一键或主键
  • 涉及的列名

例如:Duplicate entry 'test@example.com' for key 'users.email'