Skip to content

MySQL数据库设计从入门到魔改 🛠️

🏗️ 数据库建筑师手册 在这里你将掌握:

  • 数据库的诞生与毁灭 🍼💥
  • 数据表的七十二变 🐒
  • 约束条件的金钟罩 ⛑️
  • 索引的加速秘籍 🚀
  • 注释文学的艺术 📝

1. 数据库的生与死 💫

🧙 创世与湮灭

sql
-- 开天辟地:创建数据库
CREATE DATABASE 电商系统 
DEFAULT CHARACTER SET utf8mb4 
COLLATE utf8mb4_0900_ai_ci;

-- 格式化警告:慎用!
DROP DATABASE 电商系统; -- 💀 数据灰飞烟灭

2. 数据表基础三剑客 🗡️

sql
CREATE TABLE 学生档案 (
    -- 🆔 身份标识(主键:唯一且非空)
    学号 INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
    
    -- 👤 基础信息(必须填写)
    姓名 VARCHAR(20) NOT NULL COMMENT '不超过10个汉字',
    
    -- ⚧️ 枚举约束(只能选这三个值)
    性别 ENUM('男', '女', '其他') DEFAULT '其他' COMMENT '默认显示"其他"',
    
    -- 🗓️ 日期类型(存储格式:YYYY-MM-DD)
    入学日期 DATE NOT NULL COMMENT '格式示例:2023-09-01',
    
    -- 📱 唯一约束(手机号不能重复)
    手机号 CHAR(11) UNIQUE COMMENT '允许为空但不可重复'
) ENGINE=InnoDB COMMENT='学生基本信息档案';
sql
/* 🔍 表结构体检报告 */
DESC 学生档案;

/* 📜 表的DNA检测报告 */
SHOW CREATE TABLE 学生档案;
sql
-- 🧨 普通删除(表不存在会报错)
DROP TABLE 学生档案;

-- 🧯 安全删除(推荐写法)
DROP TABLE IF EXISTS 学生档案;

🚨 主键生存法则

  1. 唯一性:就像身份证号,不能重复
  2. 非空性:必须填写,不能为NULL
  3. 简洁性:尽量用数字类型(查询更快)
  4. 自增技巧AUTO_INCREMENT让数据库自动分配ID

📱 唯一约束小剧场

sql
-- 正确插入
INSERT INTO 学生档案 (手机号) VALUES ('13800138000'); ✅

-- 错误示范:重复手机号
INSERT INTO 学生档案 (手机号) VALUES ('13800138000'); ❌
-- 报错:Duplicate entry '13800138000' for key '手机号'

-- 特殊技巧:允许NULL值
INSERT INTO 学生档案 (手机号) VALUES (NULL); ✅
INSERT INTO 学生档案 (手机号) VALUES (NULL); ✅ 
-- NULL不算重复,可以多次插入

🧐 字段类型冷知识

字段类型存储空间使用场景类比说明
VARCHAR(20)动态分配姓名、地址等变长文本行李箱(按需使用空间)
CHAR(11)固定11字符手机号、身份证等定长数据固定尺寸的收纳盒
ENUM1-2字节有限选项的字段选择题的选项

3. 数据类型收纳指南 📦

🧳 数据收纳三大件

数字保险箱

  • INT:存年龄、数量等整数(-21亿~21亿)
  • DECIMAL(5,2):精确存钱(总5位,小数2位)
  • FLOAT:存科学数据,可能有微小误差

文字时光机

  • VARCHAR(100):可变长度(省空间,最大65535)
  • CHAR(11):固定长度(适合手机号/身份证)
  • TEXT:存小作文(最大65,535字符)

时间管理器

  • DATE:记录生日('2023-08-20')
  • DATETIME:精确到秒('2023-08-20 14:30:00')
  • TIMESTAMP:自动记录修改时间

4. 约束全家福 👨👩👧👦

🚧 数据交警的执法手册

sql
CREATE TABLE 员工信息 (
    ID INT PRIMARY KEY AUTO_INCREMENT,  -- 主键(唯一+非空)
    姓名 VARCHAR(20) NOT NULL,          -- 必填项
    邮箱 VARCHAR(50) UNIQUE,            -- 唯一值
    部门ID INT DEFAULT 0,               -- 默认值
    入职年份 YEAR CHECK (入职年份 > 2000), -- 自定义检查
    FOREIGN KEY (部门ID) REFERENCES 部门表(ID) -- 外键约束
);

5. 表结构美容院 💅

🧑🔧 表结构整容指南

sql
-- 增发手术:添加新列
ALTER TABLE 用户表 
ADD 个性签名 VARCHAR(100) AFTER 性别;  -- 这里after是添加到性别后面

-- 瘦身计划:删除列
ALTER TABLE 商品表 
DROP COLUMN 过期时间;

-- 改名换姓
ALTER TABLE 旧表名 RENAME TO 新表名;

-- 时间列整容(正确姿势)
ALTER TABLE users
  MODIFY last_login 
  DATETIME 
  DEFAULT CURRENT_TIMESTAMP 
  ON UPDATE CURRENT_TIMESTAMP;  -- ✅ 正确的时间函数,数据更新时自动更新

-- 微整形:修改列定义
ALTER TABLE 员工表 
MODIFY 工资 DECIMAL(10,2) NOT NULL DEFAULT 5000;

-- 身份置换:主键修改
ALTER TABLE 订单表 
DROP PRIMARY KEY,
ADD PRIMARY KEY (订单号, 用户ID);

6. 索引加速器 🚄

💡 索引使用秘籍
sql
-- 创建普通索引
CREATE INDEX 姓名索引 ON 学生表(姓名);

-- 唯一索引(加速+唯一性)
CREATE UNIQUE INDEX 邮箱索引 ON 用户表(邮箱);

-- 联合索引(查询加速套餐)
CREATE INDEX 联合索引 ON 订单表(用户ID, 下单时间);

-- 查看索引清单
SHOW INDEX FROM 用户表;

-- 删除多余索引
DROP INDEX 姓名索引 ON 学生表;

7. 注释文学 📝

🎨 代码即文档

sql
CREATE TABLE 图书信息 (
    书号 INT PRIMARY KEY COMMENT '唯一标识符',
    书名 VARCHAR(100) NOT NULL COMMENT '书籍全称',
    价格 DECIMAL(6,2) COMMENT '人民币定价'
) COMMENT='图书馆藏书基本信息';

8. 综合实战:电商系统设计 🛒

sql
-- 创建商品表
CREATE TABLE 商品 (
    商品ID INT AUTO_INCREMENT PRIMARY KEY,
    名称 VARCHAR(100) NOT NULL,
    价格 DECIMAL(10,2) CHECK(价格 > 0),
    库存 INT UNSIGNED DEFAULT 0,
    上架时间 DATETIME DEFAULT CURRENT_TIMESTAMP,
    分类ID INT,
    FOREIGN KEY (分类ID) REFERENCES 分类表(ID)
) ENGINE=InnoDB COMMENT='商品基本信息';

-- 添加折扣率列
ALTER TABLE 商品 
ADD 折扣率 DECIMAL(3,2) DEFAULT 1.00 
AFTER 价格;

-- 创建商品名称索引
CREATE INDEX 商品名称索引 ON 商品(名称);

🚨 新手避坑指南

  1. 主键陷阱:每个表必须有主键,但只能有一个
  2. 字符集迷途:推荐使用utf8mb4(支持emoji)
  3. 命名雷区:避免使用保留字(如order, group)
  4. 外键警告:需要关联表先存在,且引擎为InnoDB
  5. 修改风险:生产环境慎用ALTER TABLE(可能锁表)