63 lines
1.9 KiB
Markdown
63 lines
1.9 KiB
Markdown
# 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;
|
||
```
|
||
|
||
## 注意事项
|
||
- 所有修复都是向后兼容的
|
||
- 不会影响现有数据
|
||
- 增强了数据完整性保护
|