一、创建表完整语法CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;三个部分部分含义举例field列名字段名id、name、passworddatatype列的类型int、varchar(20)、char(32)、date后半段可选字符集 / 校验规则 / 存储引擎character set utf8 engine MyISAM课件对后半段有两条说明很重要character set 字符集如果没有指定字符集则以所在数据库的字符集为准collate 校验规则如果没有指定校验规则则以所在数据库的校验规则为准。 也就是说表会继承库的设置。你在utf8的库里建表不写字符集也是utf8。只有想这张表特殊对待时才需要显式指定。打个比方库是公司规定了所有文件用中文登记你在公司里新放一个柜子默认跟着公司规定走。除非你特别说这个柜子专门放英文资料。二、建表实战定一张用户表create table users ( id int, name varchar(20) comment 用户名, password char(32) comment 密码是32位的md5值, birthday date comment 生日 ) character set utf8 engine MyISAM;逐行拆列类型含义为什么这么选idint学号/用户编号整数字节小、比较快namevarchar(20)用户名名字长短不一用变长省空间passwordchar(32)密码的 md5 值md5 固定 32 位用定长更合适birthdaydate生日只存日期不用带时分秒2.1comment是什么name varchar(20) comment 用户名comment是字段注释写给人看的会跟着表结构一起保存。为什么一定要写因为三个月后你自己都会忘password里存的是明文还是哈希。有了注释desc一看就明白。2.2 字符集与引擎character set utf8这张表的文字用 utf8 存能放中文engine MyISAM这张表用 MyISAM存储引擎上一篇讲过它一张表对应三个文件。三、MyISAM 的三个文件课件重点说明不同的存储引擎创建表的文件不一样。users表存储引擎是 MyISAM在数据目录中有三个不同的文件分别是users.frm表结构users.MYD表数据users.MYI表索引三个字母的含义后缀全称装什么.frmform表结构有哪些列、什么类型——所有引擎都有.MYDMyISAMData表里的数据一行行记录.MYIMyISAMIndex索引目录让查询变快打个比方这张表就像一套纸质档案三件套.frm目录卡片这张表有几栏、每栏填什么.MYD一叠登记表真正填的内容.MYI索引小本本按学号排的一张速查表课件还留了个练习创建一个 engine 是 innodb 的数据库观察存储目录。 你会看到 InnoDB 的表通常是表名.frm表名.ibd数据 索引放在一个文件里甚至所有表共享一个ibdata1。这就是不同引擎存法不同的直观体现。四、查看表结构desc4.1 语法desc 表名;desc是describe的缩写4.2 示例mysql desc users; --------------------------------------------------- | Field | Type | Null | Key | Default | Extra | --------------------------------------------------- | id | int(11) | YES | | NULL | | | name | varchar(20) | YES | | NULL | | | password | char(32) | YES | | NULL | | | birthday | date | YES | | NULL | | ---------------------------------------------------六列分别是什么意思列含义白话Field字段名这一列叫什么Type数据类型这一列能存什么Null是否允许为空YES表示可以不填Key是否是索引PRI主键 /UNI唯一 /MUL普通索引空 没建索引Default默认值不填时自动填什么NULL 空着Extra附加信息比如auto_increment自增为什么一定要会desc因为接手一个陌生项目时第一件事就是desc几张核心表看它到底怎么设计的。五、修改表ALTER TABLE本篇大头课件开头那段话道出了真实开发的日常在项目实际开发中经常修改某个表的结构比如字段名字、字段大小、字段类型、表的字符集类型、表的存储引擎等等。我们还有需求添加字段、删除字段等等。这时我们就需要修改表。ALTER TABLE一共有四种常用操作ALTER TABLE tablename ADD (column datatype [DEFAULT expr][, column datatype]...); -- 加列 ALTER TABLE tablename MODIFY (column datatype [DEFAULT expr][, column datatype]...); -- 改列类型/长度 ALTER TABLE tablename DROP (column); -- 删列5.1 准备数据先往users里插两条记录后面每次改完都看一遍确认没把数据搞丢mysql insert into users values(1,a,b,1982-01-04),(2,b,c,1984-01-04);这种写法叫批量插入values后面用逗号接多组括号。5.2 加一列ADD需求加一个字段存图片路径并且放在 birthday 后面。mysql alter table users add assets varchar(100) comment 图片路径 after birthday;add后面跟新列名 类型 注释after birthday表示插在 birthday 这一列后面不写就默认加到最后。改完后看结构mysql desc users; --------------------------------------------------- | Field | Type | Null | Key | Default | Extra | --------------------------------------------------- | id | int(11) | YES | | NULL | | | name | varchar(20) | YES | | NULL | | | password | char(32) | YES | | NULL | | | birthday | date | YES | | NULL | | | assets | varchar(100) | YES | | NULL | | ---------------------------------------------------再看数据mysql select * from users; ----------------------------------------- | id | name | password | birthday | assets | ----------------------------------------- | 1 | a | b | 1982-01-04 | NULL | | 2 | b | c | 1984-01-04 | NULL | -----------------------------------------插入新字段后对原来表中的数据没有影响——老数据的assets自动填NULL。打个比方给一张已经填了字的表格新加一栏。原来每行的旧内容都还在只是新那一栏空着。5.3 改列MODIFY需求name太短了把长度从 20 改成 60。mysql alter table users modify name varchar(60);改完再看mysql desc users; --------------------------------------------------- | Field | Type | Null | Key | Default | Extra | --------------------------------------------------- | id | int(11) | YES | | NULL | | | name | varchar(60) | YES | | NULL | | ← 长度变成 60 | password | char(32) | YES | | NULL | | | birthday | date | YES | | NULL | | | assets | varchar(100) | YES | | NULL | | ---------------------------------------------------⚠️MODIFY的坑它必须写完整定义。如果你写alter table users modify name; -- ❌ 报错缺类型改长度可以改类型也可以但原来的 comment 会丢因为 MODIFY 是重写这个列的定义。要保留注释得重新写上alter table users modify name varchar(60) comment 用户名;打个比方MODIFY不是把格子撑大一点而是把这一栏整个撕下来重新画一遍——所以上面写的东西注释也得重写。5.4 删列DROP COLUMN需求密码列不要了。mysql alter table users drop password;mysql desc users; --------------------------------------------------- | Field | Type | Null | Key | Default | Extra | --------------------------------------------------- | id | int(11) | YES | | NULL | | | name | varchar(60) | YES | | NULL | | | birthday | date | YES | | NULL | | | assets | varchar(100) | YES | | NULL | | ---------------------------------------------------⚠️注意删除字段一定要小心删除字段及其对应的列数据都没了。打个比方这不是把这一栏盖住而是整列撕掉烧了。里面所有人的密码数据一起消失找不回来。 生产环境删列的稳妥做法先alter table ... add建一个新列、把数据迁过去、观察几天没问题再删旧列。或者干脆只标记弃用不真删。5.5 改表名RENAME TOmysql alter table users rename to employee;课件提示to可以省掉写成rename employee也行。改完表还是那张表数据一条不少mysql select * from employee; ------------------------------- | id | name | birthday | assets | ------------------------------- | 1 | a | 1982-01-04 | NULL | | 2 | b | 1984-01-04 | NULL | -------------------------------打个比方换个门牌号屋里东西不动。5.6 改列名CHANGE最容易被忽略的一个需求把name列改名为xingming。mysql alter table employee change name xingming varchar(60); -- 新字段需要完整定义mysql desc employee; --------------------------------------------------- | Field | Type | Null | Key | Default | Extra | --------------------------------------------------- | id | int(11) | YES | | NULL | | | xingming | varchar(60) | YES | | NULL | | | birthday | date | YES | | NULL | | | assets | varchar(100) | YES | | NULL | | ---------------------------------------------------格式是change 旧列名 新列名 类型;课件特别标注新字段需要完整定义——不能只写新名字类型也得带上。5.7 四种改法一张表记住操作语法记忆点加列ADD 列名 类型 [位置]老数据补 NULL改列类型/长度MODIFY 列名 类型要写完整定义注释会丢删列DROP 列名数据一起没最危险改列名CHANGE 旧名 新名 类型也要写完整定义改表名RENAME [TO] 新表名数据不动MODIFYvsCHANGE的区别MODIFY只改类型/长度名字不变CHANGE可以改名字顺带改类型。需要改名就用CHANGE。六、删除表6.1 语法DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...6.2 示例drop table t1;也可以一次删多张drop table t1, t2, t3;6.3 删表的后果表结构 所有数据 所有索引全部删除无法恢复除非你有备份或 binlog和丢库一样是烧掉不是放回收站。打个比方DROP TABLE 把这张表从柜子里抽出来当场粉碎。⚠️ 生产环境三条建议删前先select count(*)看一眼有多少数据心里有数先rename成表名_bak_20250101放一周确认没人用了再真删加IF EXISTSdrop table if exists t1;避免脚本里因为表不存在而中断。七、完整实操剧本照着敲一遍-- 0. 准备一个库 use shop; -- 1. 建表 create table users ( id int, name varchar(20) comment 用户名, password char(32) comment 密码md5, birthday date comment 生日 ) character set utf8 engine MyISAM; -- 2. 看结构 desc users; -- 3. 插两条数据 insert into users values(1,a,b,1982-01-04),(2,b,c,1984-01-04); select * from users; -- 4. 加一列放在 birthday 后面 alter table users add assets varchar(100) comment 图片路径 after birthday; desc users; select * from users; -- 老数据还在assets 是 NULL -- 5. 把 name 撑到 60 alter table users modify name varchar(60) comment 用户名; desc users; -- 6. 删掉 password 列想想这步之后还能恢复吗 alter table users drop password; desc users; -- 7. 改表名 alter table users rename to employee; select * from employee; -- 8. 改列名 alter table employee change name xingming varchar(60); desc employee; -- 9. 最后删表练手库可以真实项目别这么干 drop table if exists employee;八、易错点速记误解正确理解建表必须写 charset不写就继承所在库的设置modify只写列名就能改长度必须写完整定义列名 类型modify不会丢注释会丢得重新写comment加列会让老数据错位不会老数据保留新列填NULL删列只是不显示数据真的被删无法恢复改表名会丢数据不会等价于换门牌号rename后面必须写toto可省略change只改名字也得写类型完整定义MyISAM 表就一个文件是三个.frm结构、.MYD数据、.MYI索引九、本篇小结建表语法CREATE TABLE 表名 (列 类型 [comment ...], ...) [charset] [collate] [engine]不写就继承库。MyISAM 一张表 三个文件.frm结构 /.MYD数据 /.MYI索引InnoDB 是.frm.ibd。desc 表名看结构Field / Type / Null / Key / Default / Extra。ALTER TABLE四件套ADD加列、MODIFY改类型要完整定义、DROP删列数据一起没、CHANGE改列名也要完整定义RENAME TO改表名to可省。加列不影响老数据新列自动NULL。DROP TABLE是彻底销毁删前想清楚有没有备份。
阅读完成 · 觉得有帮助?