Files
akmon/doc_news/ON_CONFLICT_FIXES.md
2026-01-20 08:04:15 +08:00

1.9 KiB
Raw Permalink Blame History

ON CONFLICT (42P10) 错误修复报告

问题描述

在PostgreSQL部署过程中遇到了42P10错误there is no unique or exclusion constraint matching the ON CONFLICT specification

这个错误表示ON CONFLICT子句引用的约束不存在。

修复内容

1. ak_content_categories 表

问题: ON CONFLICT (name_key) 但name_key字段没有唯一约束 修复: 添加UNIQUE约束到name_key字段

name_key VARCHAR(64) NOT NULL UNIQUE, -- i18n key

2. ak_ai_usage_stats 表

问题: ON CONFLICT (service_type, ai_provider, date_bucket) 但没有对应的唯一约束 修复: 添加复合唯一约束

UNIQUE(service_type, ai_provider, date_bucket)

3. ak_user_profiles 表

状态: 已正确user_id字段已有UNIQUE约束

user_id uuid REFERENCES public.ak_users(id) ON DELETE CASCADE UNIQUE,

4. ak_database_versions 表

问题: ON CONFLICT (version) 但version字段没有唯一约束 修复: 添加UNIQUE约束到version字段

version VARCHAR(32) NOT NULL UNIQUE,

5. ak_cost_limits 表

状态: 使用ON CONFLICT DO NOTHING不指定字段,依赖主键

验证结果

  • 所有ON CONFLICT语句现在都有对应的唯一约束或主键
  • 保持了数据完整性
  • 支持幂等性部署

部署建议

  1. 这些修复确保了所有INSERT ... ON CONFLICT语句都能正确执行
  2. 数据库可以安全地重复执行而不会报错
  3. 唯一约束保证了数据的一致性

测试验证

建议在部署前在测试环境中验证:

-- 测试重复插入是否正常处理
INSERT INTO public.ak_content_categories (name_key, ai_keywords, sort_order) 
VALUES ('test.category', ARRAY['测试'], 999)
ON CONFLICT (name_key) DO NOTHING;

注意事项

  • 所有修复都是向后兼容的
  • 不会影响现有数据
  • 增强了数据完整性保护