# 数据库迁移：用户系统AI偏好字段

## 概述

本次更新为 `users` 表新增了 `preferred_system_ai_config_id` 字段，用于记录用户在系统AI配置池中选择的偏好配置。

## 迁移SQL

### MySQL/MariaDB

```sql
ALTER TABLE users 
ADD COLUMN preferred_system_ai_config_id INT NULL,
ADD CONSTRAINT fk_user_preferred_system_ai 
    FOREIGN KEY (preferred_system_ai_config_id) 
    REFERENCES ai_provider_configs(id) 
    ON DELETE SET NULL;
```

### SQLite

```sql
-- SQLite 不支持直接添加外键约束，需要重建表
-- 建议使用 Flask-Migrate 或手动迁移工具

-- 1. 添加新列（SQLite 3.25+）
ALTER TABLE users ADD COLUMN preferred_system_ai_config_id INTEGER NULL;

-- 注意：SQLite 需要手动维护外键关系，或使用应用层约束
```

### PostgreSQL

```sql
ALTER TABLE users 
ADD COLUMN preferred_system_ai_config_id INTEGER NULL,
ADD CONSTRAINT fk_user_preferred_system_ai 
    FOREIGN KEY (preferred_system_ai_config_id) 
    REFERENCES ai_provider_configs(id) 
    ON DELETE SET NULL;
```

## 字段说明

- **字段名**: `preferred_system_ai_config_id`
- **类型**: `INTEGER` / `INT`
- **可空**: `YES` (允许 NULL)
- **外键**: 指向 `ai_provider_configs.id`
- **删除行为**: `SET NULL`（当引用的系统AI配置被删除时，自动清空用户偏好）

## 默认值

- 所有现有用户的 `preferred_system_ai_config_id` 默认为 `NULL`
- `NULL` 表示用户未显式选择系统AI，将使用系统全局默认配置

## 回滚方案

如果需要回滚此迁移：

```sql
ALTER TABLE users DROP COLUMN preferred_system_ai_config_id;
```

## 验证

迁移后，可以通过以下SQL验证：

```sql
-- 检查字段是否存在
DESCRIBE users;  -- MySQL
-- 或
SELECT sql FROM sqlite_master WHERE name='users';  -- SQLite
-- 或
\d users;  -- PostgreSQL

-- 检查是否有用户设置了偏好
SELECT COUNT(*) FROM users WHERE preferred_system_ai_config_id IS NOT NULL;
```

## 注意事项

1. **外键约束**：确保 `ai_provider_configs` 表已存在且 `id` 字段为主键
2. **数据一致性**：迁移前建议备份数据库
3. **性能影响**：新增字段对查询性能影响极小，但建议在 `preferred_system_ai_config_id` 上创建索引（如果经常需要按此字段查询）

## 索引建议（可选）

如果经常需要查询“哪些用户选择了某个系统AI配置”，可以添加索引：

```sql
CREATE INDEX idx_users_preferred_system_ai ON users(preferred_system_ai_config_id);
```

















