«

mysql错误记录之SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1.00-1-1754236800' for key

时间:2025-8-4 14:45     作者:wanzi     分类: MYSQL


我们今天的错误是一个 数据库唯一性约束冲突(Integrity constraint violation),具体错误信息如下:

SQLSTATE[23000]: Integrity constraint violation: 1062 
Duplicate entry '1.00-1-1754236800' for key 'server_rate_user_id_record_at'

错误解析

这意味着你尝试插入一条记录,其组合值 (server_rate, user_id, record_at)1.00, 1, 1754236800,而数据库中已经存在一条具有相同组合值的记录。

数据库在这个字段组合上建立了一个 唯一索引(Unique Key),防止重复插入同一用户在同一时间的同一种统计记录。


常见原因

  1. 重复执行插入操作:同一时间段的统计被多次触发。
  2. 没有使用 INSERT ... ON DUPLICATE KEY UPDATEREPLACE INTO:应该用“存在则更新,不存在则插入”的逻辑。
    ...

解决方案

✅ 方案一:使用 ON DUPLICATE KEY UPDATE

修改插入语句,避免报错,改为更新已有记录:

INSERT INTO `stats_user` 
(`user_id`, `record_type`, `server_rate`, `u`, `d`, `record_at`, `last_visited_time`, `last_visited_target`, `updated_at`, `created_at`) 
VALUES 
(1, 'd', 1, 0, 0, 1754236800, 1754288509, 'crl32.1123.com', 1754288510, 1754288510)
ON DUPLICATE KEY UPDATE
    `u` = `u` + VALUES(`u`),
    `d` = `d` + VALUES(`d`),
    `last_visited_time` = VALUES(`last_visited_time`),
    `last_visited_target` = VALUES(`last_visited_target`),
    `updated_at` = VALUES(`updated_at`);

这样即使记录已存在,也会合并流量或更新访问信息,不会报错。


✅ 方案二:先查询是否存在,再决定插入或更新

在应用层逻辑中:

begin;
select * from stats_user where server_rate = 1 and record_type = 'd' and record_at = '2025-07-31' and user_id = 100 for update;
if (exist) :
    update ...
else:
    insert ...
commit;

写业务代码的时候,要考虑相关业务的访问频率是否超级频繁。因为你需要考虑重试次数,避免死锁