Initial commit of akmon project

This commit is contained in:
2026-01-20 08:04:15 +08:00
commit 77a2bab985
1309 changed files with 343305 additions and 0 deletions

153
DUPLICATE_COLUMN_FIX.md Normal file
View File

@@ -0,0 +1,153 @@
# 重复列名修复说明
## 问题描述
在执行 `video_system_database.sql` 时,遇到了 `ERROR: 42701: column "view_count" specified more than once` 错误。这是由于视图定义中存在重复的列名导致的。
## 根本原因
问题出现在视图定义中使用了 `c.*` (选择表的所有列) 同时又显式选择了统计表中的同名列:
```sql
-- 有问题的代码
CREATE VIEW vw_media_content_detail AS
SELECT
c.*, -- 包含了 ak_contents 表的所有列
s.view_count, -- 显式选择统计表的 view_count 列
s.like_count, -- 如果 ak_contents 也有这些列,就会重复
...
```
`ak_contents` 表被扩展添加了多媒体字段后,可能与统计表 `ak_content_statistics` 中的某些列名重复。
## 修复方案
### 1. 明确列出所需列
将所有视图中的 `c.*` 替换为明确的列列表:
```sql
-- 修复后的代码
CREATE OR REPLACE VIEW vw_media_content_detail AS
SELECT
-- 基础字段
c.id,
c.title,
c.content,
c.excerpt,
c.slug,
c.featured_image,
c.status,
c.published_at,
c.created_at,
c.updated_at,
c.content_type,
-- 视频字段
c.video_url,
c.video_duration,
c.video_poster,
-- ... 其他明确列出的字段
-- 统计字段 (不会重复)
s.view_count,
s.like_count,
s.favorite_count,
...
```
### 2. 添加视图的 `CREATE OR REPLACE`
所有视图都使用 `CREATE OR REPLACE VIEW` 语法,使脚本可以安全重复执行:
```sql
CREATE OR REPLACE VIEW vw_media_content_detail AS ...
CREATE OR REPLACE VIEW vw_video_content_detail AS ...
CREATE OR REPLACE VIEW vw_audio_content_detail AS ...
CREATE OR REPLACE VIEW vw_image_content_detail AS ...
CREATE OR REPLACE VIEW vw_video_danmakus AS ...
CREATE OR REPLACE VIEW vw_content_comments AS ...
CREATE OR REPLACE VIEW vw_popular_image_tags AS ...
CREATE OR REPLACE VIEW vw_user_media_stats AS ...
```
## 修复的视图
### 1. `vw_media_content_detail`
- **问题**`c.*` 与统计字段重复
- **修复**:明确列出所有需要的列
- **优势**:包含所有多媒体字段,避免列名冲突
### 2. `vw_image_content_detail`
- **问题**`c.*` 与统计字段重复GROUP BY 不完整
- **修复**:明确列出列名,完整的 GROUP BY 子句
- **优势**:支持图片标签聚合,避免列名冲突
### 3. 其他视图
- 所有视图都添加了 `OR REPLACE` 关键字
- 确保可以安全地重复执行
## 优势和好处
### ✅ 明确性
- 明确知道每个视图包含哪些列
- 避免意外包含不需要的列
- 便于维护和理解
### ✅ 兼容性
- 避免列名冲突
- 支持数据库结构演进
- 向后兼容现有代码
### ✅ 可维护性
- 使用 `CREATE OR REPLACE VIEW`
- 可以安全地重复执行
- 支持增量更新
### ✅ 性能优化
- 只选择需要的列
- 减少数据传输
- 提高查询效率
## 使用建议
### 开发最佳实践
```sql
-- ✅ 推荐:明确列出所需列
SELECT
c.id,
c.title,
s.view_count
FROM contents c
LEFT JOIN statistics s ON c.id = s.content_id;
-- ❌ 避免:使用 * 可能导致列名冲突
SELECT
c.*,
s.view_count -- 可能与 c.* 中的列重复
FROM contents c
LEFT JOIN statistics s ON c.id = s.content_id;
```
### 视图设计原则
1. **明确性优于简洁性**:明确列出列名比使用 `*` 更安全
2. **使用 OR REPLACE**:确保可以安全更新视图
3. **避免列名歧义**:使用表别名和明确的列名
4. **完整的 GROUP BY**:聚合查询要包含所有非聚合列
## 验证方法
### 测试视图创建
```sql
-- 这些命令现在应该都能成功执行
CREATE OR REPLACE VIEW vw_media_content_detail AS ...
CREATE OR REPLACE VIEW vw_image_content_detail AS ...
-- ... 其他视图
```
### 查询测试
```sql
-- 验证视图可以正常查询
SELECT * FROM vw_media_content_detail LIMIT 1;
SELECT * FROM vw_image_content_detail LIMIT 1;
```
修复后的数据库现在可以安全部署,所有视图都避免了列名冲突问题。