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'
错误解析
- 错误类型:
SQLSTATE[23000]
表示违反了完整性约束,通常是外键或唯一性约束。 - 错误代码 1062:在 MySQL 中表示“重复条目”(Duplicate entry)。
- 重复的条目:
'1.00-1-1754236800'
- 冲突的索引:
server_rate_user_id_record_at
这意味着你尝试插入一条记录,其组合值 (server_rate, user_id, record_at)
是 1.00, 1, 1754236800
,而数据库中已经存在一条具有相同组合值的记录。
数据库在这个字段组合上建立了一个 唯一索引(Unique Key),防止重复插入同一用户在同一时间的同一种统计记录。
常见原因
- 重复执行插入操作:同一时间段的统计被多次触发。
-
没有使用
INSERT ... ON DUPLICATE KEY UPDATE
或REPLACE 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;
写业务代码的时候,要考虑相关业务的访问频率是否超级频繁。因为你需要考虑重试次数,避免死锁