Initial commit of akmon project
This commit is contained in:
62
doc_news/ON_CONFLICT_FIXES.md
Normal file
62
doc_news/ON_CONFLICT_FIXES.md
Normal file
@@ -0,0 +1,62 @@
|
||||
# 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;
|
||||
```
|
||||
|
||||
## 注意事项
|
||||
- 所有修复都是向后兼容的
|
||||
- 不会影响现有数据
|
||||
- 增强了数据完整性保护
|
||||
Reference in New Issue
Block a user