
DROP DATABASE 按下回车MySQL 不会问你第二遍也没有回收站——库里的表、数据连同结构一起没而且没法回滚。这篇跟着一个「学生管理库」从无到有走一遍库表怎么建对需求变了怎么改以及删除之前怎么给自己留后路。文章目录先搞清楚CREATE、ALTER、DROP 到底在动什么一、第一步建一个自己的数据库二、第二步把学生表建起来三、需求变了表结构怎么改3.1 加字段ADD3.2 类型和长度设错了MODIFY3.3 字段名也要改CHANGE3.4 删字段、改表名四、最后一步不要了怎么删速查与避坑一句话总结速查表参考链接先搞清楚CREATE、ALTER、DROP 到底在动什么你听过「删库跑路」的梗但有没有想过一个问题UPDATE 改错了数据还能回滚为什么 DROP 删个库就救不回来因为这两类语句动的根本不是一个东西。SELECT、INSERT、UPDATE、DELETE 属于数据操纵语言Data Manipulation LanguageDML操作的是表里的一行行数据CREATE、ALTER、DROP 属于数据定义语言Data Definition LanguageDDL操作的是数据库结构对象——库、表、字段、索引。DDL 的特点是执行效率高、作用范围广而且不可逆结构改完、删完没有简单撤销这一说。⚠️坑DDL 直接改架构多数场景不可回滚。生产库上执行 DROP、ALTER 之前先假设这条命令永远无法撤销再决定要不要按回车。动手之前先把 5 条入门语法规范记住能排掉一大半基础报错SQL 不区分大小写CREATE、create 效果一样行业惯例是关键字大写自定义名称库名、表名、字段名小写。每条语句必须以分号;结尾少了它语句不会执行。自定义名称不能用 SQL 关键字比如 name、user、order非用不可就用反引号包起来user。命名只用小写字母、数字、下划线不用中文、空格和特殊符号名字要见名知义。注释两种单行-- 注释内容多行/* 注释内容 */。本文案例基于 MySQL 8.05.7 的基础语法同样兼容Navicat、DBeaver、MySQL 原生命令行哪个顺手用哪个。记住DDL 改的是结构、不是数据回车之前先问自己一句——还能撤销吗一、第一步建一个自己的数据库打开 MySQL很多人的第一条语句是直接建表CREATE TABLE student (...)。结果回车就报错ERROR 1046 (3D000): No database selected为什么因为数据表必须隶属于某个数据库数据库是数据表的容器。你还没告诉 MySQL 表要建在哪里它当然不干。所以第一步不是建表是建库。建库的完整语法是CREATE DATABASE IF NOT EXISTS 数据库名 DEFAULT CHARACTER SET 字符集 DEFAULT COLLATE 排序规则;三个参数逐个说IF NOT EXISTS容错用的。库不存在才创建已存在就跳过避免重复执行脚本时报错。脚本要重复跑这个参数是生产必备。DEFAULT CHARACTER SET指定默认字符集CHARACTER SET决定库里所有表的文字编码。用 utf8mb4它完整支持中文、表情和特殊字符是 MySQL 8.0 的默认值别用 utf8那是精简版不支持表情符号。DEFAULT COLLATE指定排序规则COLLATE决定字符串怎么比较、怎么排序。utf8mb4_general_ci 通用且不区分大小写utf8mb4_bin 按二进制匹配区分大小写。要点建库三件套——IF NOT EXISTS 防报错、utf8mb4 防乱码和表情问题、排序规则按业务选拿不准就用 utf8mb4_general_ci。CREATEDATABASEIFNOTEXISTSstudent_manageDEFAULTCHARACTERSETutf8mb4DEFAULTCOLLATEutf8mb4_general_ci;库建好了怎么确认三句话SHOWDATABASES;-- 查看所有数据库SHOWCREATEDATABASEstudent_manage;-- 查看库的字符集和排序规则USEstudent_manage;-- 选中数据库之后的操作都在这个库里✅验证SHOW DATABASES 的结果里能看到 student_manageSHOW CREATE DATABASE 能看到 utf8mb4 和 utf8mb4_general_ciUSE 之后命令行提示符会变成student_manage说明选中成功。刚连上 MySQL 时SHOW DATABASES 还会列出几个系统自带的库那些是 MySQL 自己运行要用的不要在里面建表、更不要删你只在自己创建的 student_manage 里操作就行。那库建错了能改吗先说结论库名改不了低版本 MySQL 不支持高版本也不推荐能改的只有默认字符集和排序规则ALTERDATABASEstudent_manageDEFAULTCHARACTERSETutf8mb4DEFAULTCOLLATEutf8mb4_bin;⚠️坑ALTER DATABASE 改字符集只对之后新建的表生效已经存在的表不会跟着变得单独用 ALTER TABLE 改。记住先建库、再 USE 选中、最后才建表字符集一步到位用 utf8mb4别等乱码了再补救。二、第二步把学生表建起来库选中了接下来是重头建表。一张表由若干字段组成每个字段有三个必备要素——字段名、数据类型、约束规则默认值、注释、主键、自增是可选项。数据类型决定这一列存什么、占多少空间入门先记三类类别常用类型用途数值TINYINT / INT / FLOAT / DOUBLE / DECIMAL小整数、常规整数、单精度小数、双精度小数、精确小数金额专用字符串VARCHAR / CHAR / TEXT变长字符串最常用、定长字符串、长文本日期时间DATE / DATETIME / TIMESTAMP年月日、年月日时分秒、时间戳约束决定这一列的数据必须遵守什么规则约束作用NOT NULL非空约束这一列必须有值DEFAULT默认值约束不填就自动补上默认值PRIMARY KEY主键约束唯一标识每一行非空且唯一AUTO_INCREMENT自增约束只用于整数主键插入时自动累加UNIQUE唯一约束这一列的值不能重复COMMENT字段注释说明字段的业务含义类型怎么选给几条能直接用的判断整数默认先用 INT确定取值范围很小年龄、状态标记这类再用 TINYINTFLOAT、DOUBLE 存的是近似值涉及金额一律用 DECIMAL字符串长度固定用 CHAR性别就一个字CHAR(1) 正好长度不固定用 VARCHAR大段文字才用 TEXT。建表的通用模板长这样CREATETABLEIFNOTEXISTS表名(字段名1数据类型 约束 默认值COMMENT字段注释,字段名2数据类型 约束 默认值COMMENT字段注释,PRIMARYKEY(主键字段))ENGINEInnoDBDEFAULTCHARSETutf8mb4COMMENT表注释;两个表级参数说一下ENGINE 指定存储引擎ENGINE用 InnoDB它支持事务、外键、索引是生产唯一推荐的引擎MyISAM 已经废弃DEFAULT CHARSET 指定表字符集统一 utf8mb4。要点ENGINEInnoDB、DEFAULT CHARSETutf8mb4入门阶段这两个值不用犹豫照着写。下面是学生表的完整建表语句字段比较多折叠起来你可以直接复制点开student 学生信息表完整建表语句USE student_manage; CREATE TABLE IF NOT EXISTS student ( stu_id INT NOT NULL AUTO_INCREMENT COMMENT 学生编号主键自增, stu_name VARCHAR(30) NOT NULL COMMENT 学生姓名, stu_gender CHAR(1) DEFAULT 未知 COMMENT 学生性别, stu_age TINYINT DEFAULT 0 COMMENT 学生年龄, stu_phone VARCHAR(11) UNIQUE COMMENT 学生手机号, enroll_date DATE COMMENT 入学日期, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 数据创建时间, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 数据更新时间, PRIMARY KEY (stu_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT学生信息基础表;逐个字段说为什么这么配stu_id 是自增主键插入数据不用手填自动从 1 开始累加性别默认「未知」、年龄默认 0新增学生时没填也不会出现一堆空值手机号加 UNIQUE从数据库层面保证两个学生不会填同一个号create_time 默认当前时间update_time 加了 ON UPDATE CURRENT_TIMESTAMP数据一改时间自动刷新不用代码维护每个字段、整张表都写了 COMMENT半年后回来看或者交接给同事不用猜这列是干嘛的——这是企业开发的基本规范。怎么确认表建对了SHOWTABLES;-- 查看当前库所有表DESCstudent;-- 查看表结构字段、类型、约束SHOWCREATETABLEstudent;-- 查看完整建表语句✅验证SHOW TABLES 能看到 studentDESC student 会列出 Field、Type、Null、Key、Default 几列每个字段的类型和约束一目了然SHOW CREATE TABLE 能看到引擎、字符集和全部约束。记住建表就是给每一列配齐三要素——主键自增、默认值兜底、注释写全后续少踩很多坑。三、需求变了表结构怎么改表建完上线业务需求一变是不是要删表重建别。删表重建的瞬间表里的数据全没。ALTER TABLE 可以在保留数据的前提下动态改结构这是日常开发用得最多的 DDL。改表养成一个固定动作改之前先 DESC 记下原来的结构改完再 DESC 一次对比确认类型、约束、注释都还在——尤其是 MODIFY最容易把约束改丢。具体用哪个动作先看这张图3.1 加字段ADD业务要记录学生籍贯和住校信息需要加列。加一个、加多个都行ALTERTABLEstudentADDstu_addressVARCHAR(100)DEFAULTCOMMENT学生籍贯地址;ALTERTABLEstudentADDclass_idINTDEFAULT0COMMENT班级编号,ADDis_liveTINYINTDEFAULT1COMMENT是否住校 1-是 0-否;记住加列用 ADD一次加多个就写多个 ADD中间用逗号隔开。3.2 类型和长度设错了MODIFYstu_name 当初设了 VARCHAR(30)后来发现名字超过 30 个字符要扩长度——字段名没起错只是属性要改用 MODIFYALTERTABLEstudentMODIFYstu_nameVARCHAR(50)NOTNULLCOMMENT学生姓名;⚠️坑MODIFY 有两个坑。第一原有数据必须兼容新类型存了文字的 VARCHAR 不能直接改成 INT会导致数据报错第二MODIFY 是整列属性重写原来的 NOT NULL、COMMENT 必须在新语句里再写一遍不写就会被重置为空。记住MODIFY 只改属性、改不了名字新语句里要把约束和注释完整写全。3.3 字段名也要改CHANGE字段名起错了、业务叫法变了用 CHANGE它可以把字段名和属性一起改ALTERTABLEstudent CHANGE stu_address stu_homeVARCHAR(150)DEFAULTCOMMENT学生籍贯地址;注意语法里旧字段名、新字段名两个都要写新字段名后面还要跟上完整的数据类型和约束——哪怕属性不变也得照抄一遍。记住CHANGE 旧名字 新名字 完整新属性想改字段名只能找它。3.4 删字段、改表名字段废弃了、表名要调整还是 ALTER TABLEALTERTABLEstudentDROPCOLUMNis_live;-- 删除字段该列数据永久丢失ALTERTABLEstudentRENAMETOstu_info;-- 修改表名ALTERTABLEstu_infoCOMMENT学生基础信息明细表;-- 修改表注释⚠️坑DROP COLUMN 删完这一列的所有数据永久丢失动手前先备份RENAME TO 改表名后代码里引用旧表名的 SQL、ORM 映射都会失效要一起改。另外生产环境的大表不要随意改字段类型ALTER 会锁表期间业务卡顿。记住删列用 DROP COLUMN、改表名用 RENAME TO这类操作先备份、再执行、最后验证。四、最后一步不要了怎么删表彻底废弃、没有业务价值了用 DROP TABLE整个库都不要了用 DROP DATABASE。推荐都带上 IF EXISTS对象不存在时只是跳过不会报错中断脚本执行任何 DROP 之前先过三句话备份做了吗这是测试库还是生产库命令里的库名、表名再核对一遍了吗三句都过了再回车。DROPTABLEIFEXISTStest_student;-- 表不存在也不报错DROPDATABASEIFEXISTStest_db;-- 删库表、数据、结构全部清空高频面试点DROP TABLE 和 DELETE 都能让表变「空」区别在哪对比项DROP TABLEDELETE语句类型DDLDML删除对象表结构和所有数据释放存储空间只删数据行保留表结构不释放空间能否回滚不可逆速度快可通过事务回滚记住DROP 连结构带数据一起删、不可恢复DELETE 只删行、表还在、能回滚删错的代价完全不是一个量级。速查与避坑一句话总结CREATE 让结构从无到有核心是字符集、存储引擎、字段约束ALTER 在不动数据的前提下改结构是日常迭代最常用的语句DROP 永久删除结构不可逆生产环境严格管控。速查表你想做的事语句创建数据库CREATE DATABASE IF NOT EXISTS 库名 DEFAULT CHARACTER SET utf8mb4 …;查看 / 选中数据库SHOW DATABASES; / USE 库名;创建数据表CREATE TABLE IF NOT EXISTS 表名 (…) ENGINEInnoDB …;查看表结构DESC 表名;加字段ALTER TABLE 表名 ADD 字段 …;改字段属性ALTER TABLE 表名 MODIFY 字段 …;改字段名ALTER TABLE 表名 CHANGE 旧名 新名 …;删字段ALTER TABLE 表名 DROP COLUMN 字段;改表名ALTER TABLE 旧表名 RENAME TO 新表名;删表 / 删库DROP TABLE IF EXISTS 表名; / DROP DATABASE IF EXISTS 库名;术语速查DDL 是数据定义语言管结构DML 是数据操纵语言管数据字符集是文字编码统一 utf8mb4排序规则决定字符串怎么比较主键唯一标识每一行自增让整数主键自动累加。参考链接MySQL 8.0 Reference Manual — CREATE DATABASEMySQL 8.0 Reference Manual — CREATE TABLEMySQL 8.0 Reference Manual — ALTER TABLEMySQL 8.0 Reference Manual — DROP TABLE