MySQL 数据库安全操作 Skill,含 DDL/DML 规范、防误删规则、备份流程
---
name: 数据库规范
description: 数据库优先原则(先改库再改代码)、goctl-model.sh 生成命令、表创建规范(NULL 值、字段命名、索引)、禁止操作(DROP/DELETE/TRUNCATE)、软删除规则、批量操作限制。
---
# 数据库规范
## 数据库信息
- **数据库名**: db_buffett
- **表前缀**: bs_
- **字符集**: utf8mb4
## ⚠️ 数据库优先修改原则(极其重要)
> **核心原则**:涉及数据库变更的需求,必须 **先修改数据库,再修改代码**。
### 执行流程
1. **判断需求类型**
- 纯前端样式修改 → 直接修改前端代码
- 涉及数据字段变更 → 进入步骤 2
2. **检查数据库结构**
- **必须首先**查看当前数据库中有哪些表
- 使用 MCP 数据库工具查询表结构
- 检查是否有关联表需要同步修改
3. **先执行数据库变更**
- 执行 `ALTER TABLE` 语句
- 验证变更成功
- **切记不可执行 DROP/TRUNCATE**
4. **再修改后端代码(强制同步 Model)**
```bash
cd backend
./goctl-model.sh <group_name> <table_name>
- 绝对禁止手动修改
model/*_gen.go 文件
- 最后修改前端代码
DROP TABLE xxx;
DROP DATABASE xxx;
DELETE FROM table_name WHERE id = 1;
UPDATE table_name SET column = value;
TRUNCATE TABLE xxx;
UPDATE table_name SET status = -1, deleted_at = NOW() WHERE id = 1;
| 类型 |
允许 NULL |
默认值 |
VARCHAR |
❌ 禁止 |
'' |
TEXT |
❌ 禁止 |
无默认值 |
INT/BIGINT |
❌ 禁止 |
0 |
TINYINT |
❌ 禁止 |
0 或 1 |
DECIMAL |
❌ 禁止 |
0.00 |
DATETIME |
✅ 允许 |
NULL |
JSON |
✅ 允许 |
NULL |
| 规则 |
示例 |
| 小写 + 下划线 |
user_name, created_at |
主键统一 id |
id BIGINT UNSIGNED |
外键 xxx_id |
user_id, category_id |
布尔 is_xxx |
is_deleted, is_active |
时间 xxx_at |
created_at, expired_at |
CREATE TABLE bs_表名 (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
name VARCHAR(100) NOT NULL DEFAULT '' COMMENT '名称',
status TINYINT NOT NULL DEFAULT 1 COMMENT '状态: 1=在线, -1=下线',
sort INT NOT NULL DEFAULT 0 COMMENT '排序值',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id),
KEY idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='表注释';
| 字段名 |
类型 |
含义 |
status |
tinyint |
1=在线, -1=下线 |
official |
tinyint |
1=官方, 2=用户创建 |
sort |
int |
排序值,越大越靠前 |
level |
tinyint |
层级:1, 2, 3 |
parent_id |
int |
父级ID,0=顶级 |
ref_id |
bigint |
主版本ID,用于多语言关联 |
lang_type |
varchar |
语言类型:zh/en/es/fr/ar |
SELECT * FROM table_name WHERE [条件];
SELECT COUNT(*) FROM table_name WHERE [条件];
UPDATE table_name SET column = value WHERE [条件] LIMIT 1;
- 批量 INSERT: 单次不超过 100 条
- 批量 UPDATE: 单次不超过 50 条
- 批量软删除: 单次不超过 10 条,必须用户确认
- ❌
ALTER TABLE DROP COLUMN
- ❌
ALTER TABLE MODIFY 缩小字段长度
- ❌ 删除有外键关联的父记录
- ❌ 在生产数据上直接执行未经测试的 SQL
| 场景 |
推荐类型 |
说明 |
| 主键 |
BIGINT UNSIGNED |
不使用 INT,预留增长空间 |
| 短文本 (< 255) |
VARCHAR(n) |
n 为实际最大长度 |
| 长文本 |
TEXT |
超过 255 字符使用 TEXT |
| 状态/类型 |
TINYINT |
范围 -128 ~ 127 |
| 排序值 |
INT |
支持负数排序 |
| 金额 |
DECIMAL(10,2) |
禁止使用 FLOAT/DOUBLE |
| 时间 |
DATETIME |
不使用 TIMESTAMP(2038 问题) |
| 大文本/结构化数据 |
JSON |
MySQL 8.0+ 原生支持 |
| UUID |
VARCHAR(36) |
固定长度 |
PRIMARY KEY (id)
UNIQUE KEY uk_user_uuid (user_uuid)
KEY idx_status (status)
KEY idx_category_id (category_id)
KEY idx_category_status (category_id, status)
索引命名规范:
- 主键:
PRIMARY KEY
- 唯一索引:
uk_字段名
- 普通索引:
idx_字段名
- 联合索引:
idx_字段1_字段2
| 操作 |
风险等级 |
说明 |
| 新增字段 |
🟢 低 |
必须指定 NOT NULL 和默认值 |
| 修改字段类型 |
🟡 中 |
只能扩大范围,禁止缩小 |
| 修改字段名 |
🔴 高 |
需要同步修改代码 |
| 删除字段 |
❌ 禁止 |
使用废弃标记,不删除 |