文章目录
一、为什么你的数据库总出bug?(新手必看误区)
刚入门的同学总喜欢直接开干(别问我怎么知道的),结果建出来的数据库要么字段乱飞,要么数据对不上。我见过最离谱的表结构,一个用户表里居然有"年龄"和"出生日期"两个字段共存(这不重复存储吗!!)。今天咱们就从零开始,手把手教你MySQL的正确打开方式。
二、环境准备(别跳过这一步!)
2.1 安装MySQL(5分钟搞定)
推荐直接去MySQL官网下载社区版,记得选8.0+版本(新功能真香!)。安装时注意这两个坑:
- 设置root密码时别用123456(别笑!真有人这么干)
- 端口号默认3306不要改(除非你确定要改)
2.2 安装可视化工具(超实用)
强烈推荐MySQL Workbench!比命令行友好100倍(官网有安装包)。安装好后记得配置连接:
Hostname: 127.0.0.1
Port: 3306
Username: root
Password: 你设置的密码
三、创建数据库(别急着建表!)
3.1 基础语法(背下来!)
CREATE DATABASE 数据库名
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
为什么要用utf8mb4?因为它支持emoji表情存储(现在知道为什么你存的微信昵称显示乱码了吧!)
3.2 举个栗子🌰
假设我们要建一个电商系统:
CREATE DATABASE ecommerce
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
四、建表核心六要素(敲黑板!)
4.1 字段命名规范(血泪教训)
- 用下划线命名法:user_name(不要用user Name)
- 字段名要有意义:别用a1、b2这种命名
- 主键统一叫id(约定俗成)
4.2 数据类型选择(容易踩坑!)
数据类型 | 存储内容 | 示例 |
---|---|---|
INT | 整数 | 用户年龄 |
VARCHAR(50) | 可变长度字符串 | 用户名 |
DECIMAL | 精确小数 | 商品价格 |
DATETIME | 日期时间 | 订单创建时间 |
TINYINT | 布尔值(0/1) | 是否删除 |
4.3 必须掌握的约束(重点!)
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT, -- 自增主键
username VARCHAR(50) NOT NULL UNIQUE, -- 非空且唯一
email VARCHAR(100) CHECK(email LIKE '%@%'), -- 自定义检查
created_at DATETIME DEFAULT CURRENT_TIMESTAMP -- 默认值
);
五、实战:电商系统建表示例
5.1 用户表(核心!)
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
password CHAR(60) NOT NULL COMMENT '存储加密后的密码',
phone VARCHAR(20) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
注意这个时间戳技巧:updated_at字段会自动记录更新时间(超实用!)
5.2 商品表(含外键)
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL CHECK(price > 0),
category_id INT NOT NULL,
stock INT DEFAULT 0,
FOREIGN KEY (category_id) REFERENCES categories(id)
);
外键关联要特别注意:必须先创建被引用的表(比如这里的categories表)
六、常见错误大全(建议收藏)
- 字符集不统一:中文变问号?检查是不是用了utf8而不是utf8mb4
- 忘记加索引:查询慢得像蜗牛?给常用查询字段加索引
- 外键约束失效:删不掉数据?检查外键关联关系
- 时间字段类型错误:用VARCHAR存时间?活该排序出错!
- 字段长度不够:用户地址只能存20个字?等着被投诉吧!
七、高级技巧(老司机专用)
7.1 表结构设计三范式(理论结合实践)
- 第一范式:每个字段都是原子的(别把地址拆成省市区存一个字段)
- 第二范式:消除部分依赖(订单表别同时存商品名和价格)
- 第三范式:消除传递依赖(用户表别存所在城市GDP数据)
7.2 逆向工程神器
Workbench的Database -> Reverse Engineer功能,可以逆向生成ER图(分析现有数据库超方便)
7.3 自动生成测试数据
用这个语句快速生成百万级测试数据:
INSERT INTO users (username, email)
SELECT
CONCAT('user', seq),
CONCAT('user', seq, '@test.com')
FROM seq_1_to_1000000;
八、总结(别光收藏不实践!)
记住这个建表口诀:
- 先画ER图再动手
- 字段类型要合适
- 约束条件不能少
- 索引优化要趁早
- 测试数据跑一遍
最后送大家一个彩蛋:在建表语句末尾加上ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
(很多教程都漏了这个!)