# 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字段 ```sql name_key VARCHAR(64) NOT NULL UNIQUE, -- i18n key ``` ### 2. ak_ai_usage_stats 表 **问题**: `ON CONFLICT (service_type, ai_provider, date_bucket)` 但没有对应的唯一约束 **修复**: 添加复合唯一约束 ```sql UNIQUE(service_type, ai_provider, date_bucket) ``` ### 3. ak_user_profiles 表 **状态**: ✅ 已正确,user_id字段已有UNIQUE约束 ```sql user_id uuid REFERENCES public.ak_users(id) ON DELETE CASCADE UNIQUE, ``` ### 4. ak_database_versions 表 **问题**: `ON CONFLICT (version)` 但version字段没有唯一约束 **修复**: 添加UNIQUE约束到version字段 ```sql version VARCHAR(32) NOT NULL UNIQUE, ``` ### 5. ak_cost_limits 表 **状态**: ✅ 使用`ON CONFLICT DO NOTHING`不指定字段,依赖主键 ## 验证结果 - ✅ 所有ON CONFLICT语句现在都有对应的唯一约束或主键 - ✅ 保持了数据完整性 - ✅ 支持幂等性部署 ## 部署建议 1. 这些修复确保了所有INSERT ... ON CONFLICT语句都能正确执行 2. 数据库可以安全地重复执行而不会报错 3. 唯一约束保证了数据的一致性 ## 测试验证 建议在部署前在测试环境中验证: ```sql -- 测试重复插入是否正常处理 INSERT INTO public.ak_content_categories (name_key, ai_keywords, sort_order) VALUES ('test.category', ARRAY['测试'], 999) ON CONFLICT (name_key) DO NOTHING; ``` ## 注意事项 - 所有修复都是向后兼容的 - 不会影响现有数据 - 增强了数据完整性保护