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

63 lines
1.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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;
```
## 注意事项
- 所有修复都是向后兼容的
- 不会影响现有数据
- 增强了数据完整性保护