1.9 KiB
1.9 KiB
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语句现在都有对应的唯一约束或主键
- ✅ 保持了数据完整性
- ✅ 支持幂等性部署
部署建议
- 这些修复确保了所有INSERT ... ON CONFLICT语句都能正确执行
- 数据库可以安全地重复执行而不会报错
- 唯一约束保证了数据的一致性
测试验证
建议在部署前在测试环境中验证:
-- 测试重复插入是否正常处理
INSERT INTO public.ak_content_categories (name_key, ai_keywords, sort_order)
VALUES ('test.category', ARRAY['测试'], 999)
ON CONFLICT (name_key) DO NOTHING;
注意事项
- 所有修复都是向后兼容的
- 不会影响现有数据
- 增强了数据完整性保护