-- 用户表:存储系统用户的基本信息和登录凭证 CREATE TABLE IF NOT EXISTS t_user ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名,唯一标识,用于登录', password_hash VARCHAR(255) NOT NULL COMMENT '密码哈希值,使用BCrypt加密存储', nickname VARCHAR(50) COMMENT '用户昵称,显示名称' ); -- 分类表:存储收支分类信息,支持用户自定义 CREATE TABLE IF NOT EXISTS t_category ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '分类ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', user_id BIGINT NOT NULL COMMENT '所属用户ID', name VARCHAR(50) NOT NULL COMMENT '分类名称', type VARCHAR(10) NOT NULL COMMENT '分类类型:INCOME-收入,EXPENSE-支出', icon VARCHAR(50) COMMENT '分类图标,可选', sort_order INT NOT NULL DEFAULT 0 COMMENT '排序序号,数值越小越靠前', INDEX idx_user_id (user_id) COMMENT '用户ID索引', INDEX idx_user_type (user_id, type) COMMENT '用户ID+类型联合索引' ); -- 收支记录表:存储每一笔收入或支出的详细信息 CREATE TABLE IF NOT EXISTS t_transaction ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '记录ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', user_id BIGINT NOT NULL COMMENT '所属用户ID', category_id BIGINT COMMENT '所属分类ID,可为空表示未分类', type VARCHAR(10) NOT NULL COMMENT '记录类型:INCOME-收入,EXPENSE-支出', amount DECIMAL(12, 2) NOT NULL COMMENT '金额,精确到分', channel VARCHAR(30) COMMENT '交易渠道:WECHAT-微信,ALIPAY-支付宝,CASH-现金,BANK-银行卡', remark VARCHAR(255) COMMENT '备注说明', remark_hidden TINYINT(1) NOT NULL DEFAULT 0 COMMENT '备注是否隐藏:1-隐藏,0-显示', external_no VARCHAR(64) COMMENT '外部账单交易号,用于账单导入去重', transaction_time DATETIME NOT NULL COMMENT '交易发生时间', include_in_stats TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否计入统计:1-计入,0-不计入(如借款、转账等)', raw_data JSON COMMENT '账单导入的原始完整数据(结构化JSON),手动记录为空', INDEX idx_user_id (user_id) COMMENT '用户ID索引', INDEX idx_category_id (category_id) COMMENT '分类ID索引', INDEX idx_transaction_time (transaction_time) COMMENT '交易时间索引', INDEX idx_user_time (user_id, transaction_time) COMMENT '用户ID+交易时间联合索引', UNIQUE INDEX uk_user_external (user_id, external_no) COMMENT '用户ID+外部交易号唯一索引,用于导入去重' ); -- 标签表:存储用户自定义标签,用于给交易打标签 CREATE TABLE IF NOT EXISTS t_tag ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '标签ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', user_id BIGINT NOT NULL COMMENT '所属用户ID', name VARCHAR(50) NOT NULL COMMENT '标签名称', color VARCHAR(20) COMMENT '标签颜色,用于前端展示', sort_order INT NOT NULL DEFAULT 0 COMMENT '排序序号,数值越小越靠前', INDEX idx_user_id (user_id) COMMENT '用户ID索引', UNIQUE INDEX uk_user_name (user_id, name) COMMENT '用户ID+标签名唯一索引' ); -- 交易标签关联表:交易与标签的多对多关系 CREATE TABLE IF NOT EXISTS t_transaction_tag ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '关联ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', transaction_id BIGINT NOT NULL COMMENT '交易记录ID', tag_id BIGINT NOT NULL COMMENT '标签ID', UNIQUE INDEX uk_transaction_tag (transaction_id, tag_id) COMMENT '交易+标签唯一索引', INDEX idx_tag_id (tag_id) COMMENT '标签ID索引' ); -- AI 配置表:存储每个用户的 AI 智能建议相关配置 CREATE TABLE IF NOT EXISTS t_ai_config ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '配置ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', user_id BIGINT NOT NULL COMMENT '所属用户ID', enabled TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否启用AI智能建议:1-启用,0-关闭', api_key VARCHAR(255) COMMENT 'DeepSeek API Key(明文存储)', base_url VARCHAR(255) NOT NULL DEFAULT 'https://api.deepseek.com' COMMENT 'API 基础地址', model VARCHAR(50) NOT NULL DEFAULT 'deepseek-chat' COMMENT '使用的模型名称', vision_model VARCHAR(50) NOT NULL DEFAULT 'deepseek-flash' COMMENT '图片记账使用的视觉模型名称', UNIQUE INDEX uk_user_id (user_id) COMMENT '用户ID唯一索引,每个用户一条配置' ); -- AI 使用记录表:记录每次调用 DeepSeek 的用量与结果 CREATE TABLE IF NOT EXISTS t_ai_usage ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '记录ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', user_id BIGINT NOT NULL COMMENT '所属用户ID', type VARCHAR(20) NOT NULL COMMENT '调用类型:SUGGEST-生成建议,TEST-测试连接', model VARCHAR(50) COMMENT '模型名称', transaction_count INT NOT NULL DEFAULT 0 COMMENT '本次分析的记录数', prompt_tokens INT NOT NULL DEFAULT 0 COMMENT '输入 token 数', completion_tokens INT NOT NULL DEFAULT 0 COMMENT '输出 token 数', total_tokens INT NOT NULL DEFAULT 0 COMMENT '总 token 数', cached_tokens INT NOT NULL DEFAULT 0 COMMENT '缓存命中的输入 token 数', success TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否成功:1-成功,0-失败', error_message VARCHAR(500) COMMENT '失败原因', duration_ms BIGINT COMMENT '调用耗时(毫秒)', INDEX idx_user_created (user_id, created_at) COMMENT '用户ID+创建时间联合索引' ); -- AI 记账图片表:保存用户上传的账单/支付截图及其解析结果摘要 CREATE TABLE IF NOT EXISTS t_ai_image ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '图片ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', user_id BIGINT NOT NULL COMMENT '所属用户ID', file_path VARCHAR(500) NOT NULL COMMENT '图片本地存储相对路径', mime_type VARCHAR(50) COMMENT '图片 MIME 类型,如 image/jpeg', file_size BIGINT NOT NULL DEFAULT 0 COMMENT '图片文件大小(字节)', width INT COMMENT '图片宽度(像素)', height INT COMMENT '图片高度(像素)', model VARCHAR(50) COMMENT '解析使用的视觉模型名称', summary VARCHAR(500) COMMENT '解析结果摘要', record_count INT NOT NULL DEFAULT 0 COMMENT '解析出的交易记录条数', INDEX idx_ai_image_user_created (user_id, created_at) COMMENT '用户ID+创建时间联合索引' ); -- AI 记账图片与交易记录关联表:记录每张图片解析生成的交易记录 CREATE TABLE IF NOT EXISTS t_ai_image_transaction ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '关联ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', image_id BIGINT NOT NULL COMMENT 'AI 记账图片ID', transaction_id BIGINT NOT NULL COMMENT '交易记录ID', UNIQUE INDEX uk_ai_image_transaction (image_id, transaction_id) COMMENT '图片+交易唯一索引', INDEX idx_ai_image_transaction_transaction_id (transaction_id) COMMENT '交易记录ID索引' ); -- 通知配置表:存储每个用户的账单导入提醒设置 CREATE TABLE IF NOT EXISTS t_notification_config ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '配置ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', user_id BIGINT NOT NULL COMMENT '所属用户ID', enabled TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否启用定时提醒:1-启用,0-关闭', frequency VARCHAR(10) NOT NULL DEFAULT 'MONTHLY' COMMENT '提醒周期:DAILY-每天,WEEKLY-每周,MONTHLY-每月', day_of_month INT NOT NULL DEFAULT 1 COMMENT '每月提醒日(1-28),frequency=MONTHLY 时生效', day_of_week INT NOT NULL DEFAULT 1 COMMENT '每周提醒日(1-7,1为周一),frequency=WEEKLY 时生效', send_time VARCHAR(5) NOT NULL DEFAULT '09:00' COMMENT '提醒时间(HH:mm)', last_sent_at DATETIME COMMENT '最近一次发送时间,用于避免重复提醒', UNIQUE INDEX uk_notification_config_user_id (user_id) COMMENT '用户ID唯一索引,每个用户一条配置' ); -- 通知渠道表:存储用户配置的邮箱、Server 酱等推送渠道 CREATE TABLE IF NOT EXISTS t_notification_channel ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '渠道ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', user_id BIGINT NOT NULL COMMENT '所属用户ID', type VARCHAR(20) NOT NULL COMMENT '渠道类型:EMAIL-邮箱,SERVERCHAN-Server 酱', name VARCHAR(50) COMMENT '渠道名称,便于用户识别', enabled TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用:1-启用,0-关闭', config TEXT COMMENT '渠道配置(JSON),如 webhook 地址、SMTP 账号等', INDEX idx_notification_channel_user_id (user_id) COMMENT '用户ID索引' ); -- 通知发送日志表:记录每次提醒的发送结果,便于排查问题 CREATE TABLE IF NOT EXISTS t_notification_log ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '日志ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', user_id BIGINT NOT NULL COMMENT '所属用户ID', channel_id BIGINT COMMENT '渠道ID,测试或渠道已删除时可能为空', channel_type VARCHAR(20) COMMENT '渠道类型', success TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否成功:1-成功,0-失败', message VARCHAR(500) COMMENT '结果描述或失败原因', INDEX idx_notification_log_user_created (user_id, created_at) COMMENT '用户ID+创建时间联合索引' ); -- HTTP 访问日志表:记录每次接口请求的方法、路径、状态与耗时,便于追溯接口调用 CREATE TABLE IF NOT EXISTS t_http_log ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '日志ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', user_id BIGINT COMMENT '用户ID,未登录或认证失败时为空', method VARCHAR(10) COMMENT '请求方法:GET/POST/PUT/DELETE 等', path VARCHAR(255) COMMENT '请求路径', query_string VARCHAR(1000) COMMENT 'URL 查询参数', status INT COMMENT 'HTTP 响应状态码', duration_ms BIGINT COMMENT '处理耗时(毫秒)', ip VARCHAR(64) COMMENT '客户端IP', user_agent VARCHAR(500) COMMENT 'User-Agent', INDEX idx_http_log_created (created_at) COMMENT '创建时间索引', INDEX idx_http_log_user_created (user_id, created_at) COMMENT '用户ID+创建时间联合索引' ); -- 登录日志表:记录每次登录尝试的结果,便于审计与排查 CREATE TABLE IF NOT EXISTS t_login_log ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '日志ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', user_id BIGINT COMMENT '用户ID,登录失败或用户不存在时为空', username VARCHAR(50) COMMENT '登录用户名', success TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否成功:1-成功,0-失败', message VARCHAR(500) COMMENT '结果描述或失败原因', ip VARCHAR(64) COMMENT '客户端IP', user_agent VARCHAR(500) COMMENT 'User-Agent', INDEX idx_login_log_created (created_at) COMMENT '创建时间索引', INDEX idx_login_log_user_created (user_id, created_at) COMMENT '用户ID+创建时间联合索引' ); -- 自定义分类与标签规则表:按关键词、收支类型、金额区间自动归类与打标签 CREATE TABLE IF NOT EXISTS t_rule ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '规则ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', user_id BIGINT NOT NULL COMMENT '所属用户ID', name VARCHAR(50) NOT NULL COMMENT '规则名称', enabled TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用:1-启用,0-停用', sort_order INT NOT NULL DEFAULT 0 COMMENT '优先级,数值越小越优先', type VARCHAR(10) COMMENT '限定收支类型:INCOME-收入,EXPENSE-支出,为空表示不限', keyword VARCHAR(100) COMMENT '关键词,匹配备注/交易对方/商品名称(包含匹配,忽略大小写)', min_amount DECIMAL(12, 2) COMMENT '金额下限(含),可为空', max_amount DECIMAL(12, 2) COMMENT '金额上限(含),可为空', category_id BIGINT COMMENT '命中的目标分类ID,可为空', INDEX idx_rule_user_id (user_id) COMMENT '用户ID索引' ); -- 规则标签关联表:规则与标签的多对多关系 CREATE TABLE IF NOT EXISTS t_rule_tag ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '关联ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', rule_id BIGINT NOT NULL COMMENT '规则ID', tag_id BIGINT NOT NULL COMMENT '标签ID', UNIQUE INDEX uk_rule_tag (rule_id, tag_id) COMMENT '规则+标签唯一索引', INDEX idx_rule_tag_tag_id (tag_id) COMMENT '标签ID索引' ); -- 邮箱账单配置表:存储用户用于自动拉取账单附件的 IMAP 邮箱连接信息 CREATE TABLE IF NOT EXISTS t_email_bill_config ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '配置ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', user_id BIGINT NOT NULL COMMENT '所属用户ID', name VARCHAR(50) NOT NULL COMMENT '配置名称,便于用户识别', host VARCHAR(255) NOT NULL COMMENT 'IMAP 服务器地址', port INT NOT NULL DEFAULT 993 COMMENT 'IMAP 端口', use_ssl TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否使用 SSL:1-是,0-否', username VARCHAR(255) NOT NULL COMMENT '邮箱账号', password VARCHAR(255) NOT NULL COMMENT '邮箱授权码(明文存储,前端脱敏返回)', folder VARCHAR(100) NOT NULL DEFAULT 'INBOX' COMMENT '监听的邮件文件夹', enabled TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否启用监听:1-启用,0-关闭', status VARCHAR(20) NOT NULL DEFAULT 'DISCONNECTED' COMMENT '连接状态:DISCONNECTED-未连接,CONNECTED-已连接,POLLING-轮询中,ERROR-异常', last_error VARCHAR(500) COMMENT '最近一次连接或拉取失败原因', last_connected_at DATETIME COMMENT '最近一次成功连接时间', last_uid BIGINT COMMENT '已处理的最大邮件 UID,用于增量拉取', expense_category_id BIGINT COMMENT '默认支出分类ID,可为空', income_category_id BIGINT COMMENT '默认收入分类ID,可为空', tag_ids TEXT COMMENT '默认标签ID列表(JSON数组)', fetch_scope VARCHAR(20) NOT NULL DEFAULT 'INCREMENT' COMMENT '拉取范围:INCREMENT-仅新邮件,DAYS-最近N天,COUNT-最近N封', fetch_limit INT COMMENT '拉取范围数量:DAYS 为天数,COUNT 为封数', INDEX idx_email_bill_config_user_id (user_id) COMMENT '用户ID索引' ); -- 邮箱账单发件人规则表:按邮件发件人匹配账单类型与默认归类 CREATE TABLE IF NOT EXISTS t_email_bill_sender_rule ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '规则ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', user_id BIGINT NOT NULL COMMENT '所属用户ID', name VARCHAR(50) NOT NULL COMMENT '规则名称', enabled TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用:1-启用,0-停用', sort_order INT NOT NULL DEFAULT 0 COMMENT '优先级,数值越小越优先', sender_patterns TEXT COMMENT '发件人匹配串列表(JSON数组),包含匹配且忽略大小写', bill_type VARCHAR(20) NOT NULL COMMENT '命中的账单类型:ALIPAY/WECHAT/MEITUAN/CMB/BOCOM', archive_password VARCHAR(100) COMMENT '该来源账单压缩包解压密码,可为空', expense_category_id BIGINT COMMENT '默认支出分类ID,可为空', income_category_id BIGINT COMMENT '默认收入分类ID,可为空', tag_ids TEXT COMMENT '默认标签ID列表(JSON数组)', INDEX idx_email_bill_sender_rule_user_id (user_id) COMMENT '用户ID索引' ); -- 邮箱账单消息表:记录拉取到的账单附件,解析与入库由用户手动触发 CREATE TABLE IF NOT EXISTS t_email_bill_message ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '消息ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', config_id BIGINT NOT NULL COMMENT '邮箱配置ID', user_id BIGINT NOT NULL COMMENT '所属用户ID', uid BIGINT NOT NULL COMMENT '邮件 IMAP UID', message_id VARCHAR(255) COMMENT '邮件 Message-ID', subject VARCHAR(500) COMMENT '邮件主题', from_address VARCHAR(255) COMMENT '发件人地址', received_at DATETIME COMMENT '邮件接收时间', attachment_index INT NOT NULL DEFAULT 0 COMMENT '附件在邮件中的序号(从0开始)', attachment_name VARCHAR(255) COMMENT '附件文件名', attachment_path VARCHAR(500) COMMENT '附件本地存储相对路径', sender_rule_id BIGINT COMMENT '命中的发件人规则ID', bill_type VARCHAR(20) COMMENT '命中的账单类型,未命中时为空', status VARCHAR(20) NOT NULL DEFAULT 'PULLED' COMMENT '处理状态:PULLED-待解析,CONFIRMED-已导入,IGNORED-已忽略', error VARCHAR(500) COMMENT '解析失败原因', UNIQUE INDEX uk_email_bill_message (config_id, uid, attachment_index) COMMENT '配置+UID+附件序号唯一索引,用于去重', INDEX idx_email_bill_message_user_status (user_id, status) COMMENT '用户ID+状态联合索引' ); -- 用户偏好表:按用户存储键值形式的偏好配置 CREATE TABLE IF NOT EXISTS t_user_preference ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '偏好ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', user_id BIGINT NOT NULL COMMENT '所属用户ID', pref_key VARCHAR(50) NOT NULL COMMENT '偏好键,如 billSourceIncludeInStats / excludedDisplayStyle', pref_value TEXT COMMENT '偏好值,标量字符串或 JSON', UNIQUE INDEX uk_user_pref (user_id, pref_key) COMMENT '用户+偏好键唯一索引' ); -- 用户自定义交易渠道表:仅存放用户自建渠道,内置渠道由枚举维护 CREATE TABLE IF NOT EXISTS t_channel ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '渠道ID,主键自增', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', user_id BIGINT NOT NULL COMMENT '所属用户ID', code VARCHAR(30) NOT NULL COMMENT '渠道编码,后端生成且稳定不变,交易记录按此关联', name VARCHAR(50) NOT NULL COMMENT '渠道名称,用户可修改', sort_order INT NOT NULL DEFAULT 0 COMMENT '排序序号,数值越小越靠前', UNIQUE INDEX uk_channel_user_code (user_id, code) COMMENT '用户+渠道编码唯一索引', UNIQUE INDEX uk_channel_user_name (user_id, name) COMMENT '用户+渠道名称唯一索引', INDEX idx_channel_user_id (user_id) COMMENT '用户ID索引' );