我们首先理清数据库和数据表的关系,数据库相当于一个独立的数据文件夹,数据表就是存放在这个文件夹内部的结构化文件,一个数据库中能够创建多张数据表,想要操作某一张表之前,必须先用 use 指令进入它所属的目标数据库,这也是后续所有表操作的前提。
二、表的操作
创建表
create table 表名称 (...)
创建表使用 create table 关键字,整体语法分为字段定义与表配置两部分,括号内部依次填写各个列名与对应数据类型,多个字段之间用逗号隔开,括号外部可以选择性写明字符集、校对规则和存储引擎。其中 field 代表自定义的列名称,datatype 用来限定该字段的数据存储类型,字符集 character set 和校对规则 collate 如果在建表语句里没有手动指定,就会自动沿用当前所在数据库的对应编码配置,存储引擎 engine 不额外声明时,则采用 MySQL 配置文件里预设的默认引擎参数,日常建表大多可以省略末尾三项配置,直接依托库的默认参数生效。
下面我们举个创建表的例子:
我们先执行 create database user_db; 创建用户数据库,再通过 use user_db; 切换进入该库。下面我们就可以建表了:
实际开发中借助 alter table 完成表结构变更,分为新增字段、修改字段属性、删除字段三类操作,下面我们基于之前 user1、user2 这两个表进行落地使用:
1. ADD 新增字段
alter table 表名 add(字段名 数据类型 默认值,...);
可一次性追加单个或多个字段,示例:alter table user1 add(age int default 0);,给 user1 新增 age 整型字段,默认值为 0。
2. MODIFY 修改字段类型/约束
alter table 表名 modify(字段名 新数据类型 默认值,...);
仅改动字段的数据类型、长度、默认值,不能修改字段名称,示例:alter table user1 modify age tinyint;,把 age 字段从 int 改成 tinyint。
3. DROP 删除字段
alter table 表名 drop(字段名);
移除指定字段和该字段存储的全部数据,示例:alter table user1 drop(age);,删掉刚才新增的 age 字段。
下面举个重命名的修改例子,比如我们对 user1 这个表进行重命名命名为 user。
alter table 原名字 rename to 目标名字;
我们先通过 desc user1; 查看表结构,确认 user1 包含 id、name、password、birthday 四个字段,随后执行 alter table user1 rename to user; 完成数据表重命名,该语句可以把原表名 user1 修改为 user,语句执行无报错后,再使用 show tables; 核查库内表列表,查询结果里原 user1 消失、新名称 user 出现,代表表重命名操作生效。另外还有简写写法 alter table user1 rename user;,可以省略 to 关键字,效果完全一致。
下面我们在表中插入内容:
我们先使用 insert into user values(1,'张三','12345','2010-1-1'); 和 insert into user values(2,'李四','54321','2015-1-1'); 两条语句向 user 表完整插入两条全字段数据,执行 select * from user; 查询可以看到两条已录入的用户信息。
下面我们想再新增一个列,这个列中的字段用来保存某种路径(比如说图片路径):
执行 alter table user add image_path varchar(128) comment '这个是用户的头像路径' after birthday;,语句里 after birthday 控制新字段排在 birthday 字段的后面,新增字段默认值为 NULL,再次全表查询时,原有两条数据的 image_path 列自动填充为空,字段添加生效。
我们先执行 desc user; 查看字段原有属性,发现 name 字段原本是 varchar(20),随后用 alter table user modify name varchar(60); 修改字段类型长度,modify 语法只变更字段的数据类型、长度、约束,不能修改字段名称。修改完毕再次 desc 查表,name 类型变为 varchar(60),表内已存在的张三、李四数据不受改动影响,只变更表结构属性、不改动原有存储数据。
补充:若需要同时改字段名 + 字段类型,改用 alter table user change 旧字段名 新字段名 新类型;。
再下来比如我们想删除其中一列,比如 password 密码这一列:
我们先通过 desc user; 查看表结构,确认存在 password 字段,再用 select * from user; 查看表里存储的密码数据,随后执行 alter table user drop password; 删除该字段,这条指令在移除字段定义的同时,会连带清空该列所有原有数据。
我们前面说过,如果要修改数据表的名称,先用 alter table user rename to User; 把 user 重命名为 User,to 关键字可省略,简写 alter table User rename users; 再次将表名改成 users,执行 show tables; 就能校验改名结果。
那现在如果我们想修改某一字段的名称呢? 比如我们想把 name 这个字段名称改为 xingming 呢?
修改字段名称需要使用 change 语法,执行 alter table users change name xingming varchar(60) DEFAULT NULL; ,该语法必须依次填写原字段名、新字段名、字段完整数据类型与约束,哪怕字段类型不需要改动也必须重写类型定义,执行 desc users; 查看表结构,原 name 字段成功替换为 xingming,原有数据不受修改影响。
补充区分:modify 仅改字段属性不能改名,change 既能改字段名也能同步修改字段类型。
删除表
我们通过 drop table user2;、drop table user3; 两条语句完成数据表删除,执行后不仅 MySQL 库内的表被移除,Linux 磁盘对应目录里该表的配套物理文件也会同步被系统删除,表结构与内部存储的数据全部永久清除。