频繁执行pim:completeness:calculate报1062主键重复错误如何解决
执行 ' INSERT INTO pim_catalog_completeness (locale_id, channel_id, product_id, missing_count, required_count) VALUES (?, ?, ?, ?, ?),(?, ?, ?, ?, ?),(?, ?, ?, ?, ?)' 时出现异常,参数为 ["58", "1", 52597, 0, 21, "58", "1", 52599, 0, 21, "58", "1", 52598, 1, 21]:SQLSTATE[23000]: 完整性约束冲突:1062 键 'pim_catalog_completeness.PRIMARY' 的重复条目 '2147483647'
报错原因
- 2147483647是MySQL中有符号INT类型的最大存储值,
pim_catalog_completeness表的主键id为自增INT类型,当自增序列增长到这个上限后,后续所有新插入请求都会尝试使用2147483647作为主键值,因此触发主键唯一约束冲突报错。 - 频繁全量执行
pim:completeness:calculate命令会反复生成大量完整性记录,快速消耗自增ID的可用额度,加快了达到INT上限的速度。
解决方案
- 先确认字段类型:执行SQL
DESC pim_catalog_completeness;查看主键id的字段类型,确认是否为INT(11)类型,验证是否达到类型上限。 - 调整字段类型:如果确认是INT上限问题,执行SQL
ALTER TABLE pim_catalog_completeness MODIFY COLUMN id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT;将主键改为无符号BIGINT类型,该类型上限为18446744073709551615,完全可以满足长期使用需求。 - 快速修复方案:由于完整性记录支持全量重新计算,也可以先清空表重置自增序列:执行
TRUNCATE TABLE pim_catalog_completeness;清空所有旧的完整性记录,之后重新执行pim:completeness:calculate全量计算即可,此时自增ID会从1重新开始计数。 - 长期优化:避免频繁执行全量完整性计算,优先使用内置的增量计算逻辑,仅更新发生变更的产品的完整性数据,减少无效ID消耗。
内容的提问来源于stack exchange,提问作者igormukhingmailcom
相关产品推荐
相关产品推荐

