文章目录
(零基础友好!)今天咱们来唠唠怎么在MySQL里正确创建数据库和表这个看似简单实则暗藏玄机的操作!!!很多新手以为不就是CREATE DATABASE
和CREATE TABLE
吗?Too young too simple!(后面有你哭的时候)
一、安装MySQL的正确姿势
工欲善其事必先利其器!推荐去MySQL官网下载最新社区版(完全免费不要钱!!!)。安装时这几个选项千万别乱点:
- Authentication Method选强密码加密(老系统兼容选传统方式)
- 端口号默认3306(生产环境记得改!!)
- 勾选添加环境变量(命令行操作必备)
安装完记得用mysql -u root -p
测试登录(输完密码手别抖!)
二、创建数据库的三大禁忌
1. 字符集翻车现场
CREATE DATABASE mydb; -- 默认字符集是啥?看服务器配置!
(血泪教训)一定要显式指定字符集:
CREATE DATABASE mydb
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
为啥用utf8mb4?因为能存emoji表情啊!普通utf8只能存3字节字符(遇到生僻字直接爆炸💥)
2. 权限管理黑洞
GRANT ALL PRIVILEGES ON mydb.* TO 'user'@'localhost'; -- 典型作死操作
(重要!!)遵循最小权限原则:
GRANT SELECT,INSERT,UPDATE ON mydb.*
TO 'app_user'@'192.168.1.%'
IDENTIFIED BY 'StrongPassword123!';
3. 存储引擎选型灾难
虽然MySQL默认是InnoDB,但显式声明更保险:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY
) ENGINE=InnoDB;
MyISAM早该淘汰了!(不支持事务、行级锁)除非你在做全文检索…
三、建表时的七个必看细节
1. 主键设计雷区
CREATE TABLE orders (
order_no VARCHAR(20) PRIMARY KEY -- 用业务字段当主键?找死!
);
(最佳实践)自增ID做主键,业务字段加唯一索引:
CREATE TABLE orders (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
order_no VARCHAR(20) UNIQUE NOT NULL
);
2. 时间字段的坑
created_time DATETIME -- 时区问题搞死你!
用TIMESTAMP存储自动转换时区:
created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
3. 浮点数精度灾难
price FLOAT -- 金额用浮点?财务要杀人了!
必须用DECIMAL:
price DECIMAL(10,2) -- 整数8位+小数2位
4. 枚举类型陷阱
status ENUM('new','paid') -- 想加状态要改表结构!
改用字典表或TINYINT:
status TINYINT UNSIGNED NOT NULL COMMENT '0-新订单 1-已支付'
5. 索引使用禁忌
乱加索引比不加更可怕!这几种情况必须加:
- WHERE条件常用字段
- 外键字段
- ORDER BY/GROUP BY字段
但注意:
INDEX idx_name (name(10)) -- 前缀索引慎用!
6. 外键约束的正确打开方式
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE -- 级联删除?数据怎么没的都不知道!
推荐用ON DELETE SET NULL
+应用程序控制
7. 注释规范
address VARCHAR(200) -- 用户地址
这注释写了等于没写!应该:
address VARCHAR(200) COMMENT '收货地址,包含省市区街道,最大支持200字符'
四、终极避坑工具推荐
- 使用
SHOW CREATE TABLE
查看建表语句 - 官方神器MySQL Workbench可视化设计
- 用
EXPLAIN
分析SQL执行计划 - 定期运行
CHECK TABLE
检测表状态
五、真实案例:用户表设计
CREATE TABLE `user` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`username` VARCHAR(50) NOT NULL COMMENT '用户名(唯一)',
`mobile` VARCHAR(20) NOT NULL COMMENT '手机号(带国际区号)',
`email` VARCHAR(100) DEFAULT NULL COMMENT '邮箱地址',
`password_hash` CHAR(60) NOT NULL COMMENT 'BCrypt加密后的密码',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_username` (`username`),
UNIQUE KEY `uniq_mobile` (`mobile`),
INDEX `idx_email` (`email`(20))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
(注意看这里用到的所有技巧!!!)
六、高频问题急救箱
Q:表建错了怎么删?
A:DROP TABLE IF EXISTS table_name;
(删库到跑路的最后一步!)
Q:忘记加某个字段怎么办?
A:ALTER TABLE table ADD COLUMN ... AFTER existing_column;
Q:生产环境怎么修改大表结构?
A:用pt-online-schema-change工具(直接改会锁表!)
最后送大家一句金句:设计数据表时多花一小时,上线后能少加班一星期! (别问我怎么知道的😭)