表的操作
- 前言
- 正式开始
- 建表
- 查看表
- show tables;
- desc xxx;
- show create table xxx;
- 修改表
- 修改表名 rename to
- 对表结构进行修改
- 新增一个列 add
- 对指定列的属性做修改 modify
- 修改列名 change
- 删除某列 drop
- 删除表 drop
前言
前一篇讲了库相关的操作,如果你不太懂,可以先看看上一篇:【MySQL】库的相关操作 + 库的备份和还原
本篇主要讲解对表的增删查改工作。
正式开始
建表
先给出这张表:
先来创建一张表让你看看,首先创建一个数据库:
前面博客讲过,创建一个数据库就是在配置文件中的datadir目录下创建一个同名目录:
还会有一个文件来保存其字符集和校验规则的:
这里就不再说为啥了,不知道为啥的同学可以看这篇:数据库基本概念
在db_test中创建一张表,我这里直接给出复杂的:
来解释解释。
建表的时候列的列名和列类型都放在()中,列名在前,列类型在后,列类型后面跟的comment就像平时写代码的注释一样。各个列之间用,间隔,注意最后一列后面不要加,。
charset就是字符集,collate就是校验规则,engine就是存储引擎。
字符集、校验规则、存储引擎在默认情况下都是有的,字符集和校验规则如果不指明就会用数据库的默认字符集和校验规则,存储引擎在配置文件中就已经搞好了。
创建数据库的时候如果不指明数据库的字符集和校验规则就会直接用配置文件中的字符集和其对应的默认校验规则。
关于配置文件我刚刚给的那篇博客中也有,这里再给出来:
这里我的配置文件中字符集为utf8,默认存储引擎为InnoDB。
不过我上面创建表的时候指明了字符集、校验规则、默认存储引擎,所以就会直接按照我给出来的:
字符集为utf8,校验规则为utf8_general_ci,存储引擎为MyIsam。
存储引擎不同会有什么区别呢?
当前这个表创建好这个表之后会多出三个文件:
再来创建一个新的,存储引擎用InnoDB:
注:上面的完全是可以写在一行的,不过这样写起来更美观。
都是默认的,字符集utf8,校验规则utf8_general_ci,存储引擎InnoDB。
再看多了几个文件:
可以看到新增了两个文件。
第一个user用的是MyIsam,创建出了三个文件。
第二个用的是InnoDB,创建出了两个文件。
不同存储引擎对应磁盘文件个数是不一样的,MyIsam是3个,InnoDB是2个,后缀MY开头的就是MyIsam的文件,D表示Data,MYD后缀就MyIsam的数据文件,MYI是MyIsam的索引文件。后缀i开头的是InnoDB的文件,InnoDB是将数据和索引放在一块存的,所以文件个数不一样。后续我讲索引的博客会详谈这一点。
这里最重要的是知道create table可以创建表就行。
后面还可以加上if not exists:
因为前面有user2,所以不会成功的,里面的字段还是不变:
这里desc是查看表的一个操作,等会就说。
查看表
首先用select database()来查看你现在选中的是哪一个数据库。
这里就是我刚刚创建出来的数据库。
show tables;
show tables可以查看你在这个数据库中创建的所有表:
desc xxx;
decs xxx; 可以查看xxx表的详细信息:
这里面只要知道前面两列的Field、Type(其中的varchar这样的类型在下一篇讲类型的时候说)就行,后面的四个字段Null、Key、Default、Extra我也是会在后面索引的博客中再细说。
不过这里还有一些东西看不到,比如说注释、字符集、校验规则啥的看不到,想要看到的话用:
show create table xxx;
直接用show create table xxx; 看起来有点难受:
可以将;改成\G:
这样可以在现实的时候去掉一些不必要的字段。
上面的 show create table xxx; 可以看到创建表时候的详细信息,所以每个表的列字段属性,查看表的详细信息,现在都能看到了,但有个小问题,当时创建表的时候可不是这里 show create table xxx;显示出来的这样写的,因为mysqld会对你的指令做词法语法分析,可能你刚开始写的不太标准,它就会给你转化成更标准的写法。既然能查到,肯定也是将这些操作记录下了。
修改表
在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型,表的存储引擎等等。我们还有需求,添加字段,删除字段等等。这时我们就需要修改表。
都是这样的格式:
alter table 表名 操作 ...
修改表名 rename to
把刚刚的user改成User:
其实不用加to也可以:
对应目录下文件名也会被修改:
对表结构进行修改
来往其中插入点数据:
新增一个列 add
新增一个列,假如说用来保存用户的一张图片的路径。(假如说图片在系统的某个路径下,现在不想在数据库中保存图片,而是保存图片的路径,所以新增一个列来保存路径)。
add就是新增一个列,其中after表示插入到哪一列的后面。
其实默认就是在最后一列插入:
指定:
注意不能插入重名的:
再来查看一下User的数据:
其中新增列的数据为空。在这个列新增之前没有这个属性,所以默认就是空,对原来的字段是不影响的。
show create:
可以看到新增了一列。
对指定列的属性做修改 modify
还是User:
比如说我要对name这一列做修改,将varchar的长度由20改为60。
这里将长度改长,并不会影响表中的数据:
再show一下:
可以看到注释丢了,这里改不是该一部分,而是将原来的属性字段全部覆盖掉。
修改列名 change
注意这里改列名和改表名要去分开,不要搞混了。
前面的rename to进行修改表名字的时候是原名在rename to前,新名在rename to后。
这里是都在change后面,原名后面跟新名。
注意不能修改成重名的:
删除某列 drop
还是User:
删掉密码那一列:
select:
可以看到整列的数据都没了。
注意,删除某一列,这一列的数据都会丢失,所以删除的时候一定要谨慎,没用的再删,或者备份一下。
到这里就完了,修改表结构就这三个操作,增删改,没有查,查是用desc、select、show create table查看整个表。
删除表 drop
直接给例子了:
记住,修改表和删除表轻易不要做,数据库本身在业务中是最靠近底层的,底层的东西一边,上层的东西就要跟着变,非常麻烦,表中的类属性、名称等的改变会直接决定上层要不要变,数据库名字一改,那么用到这个数据库的软件就都要改,如果出现开发到一半要改表结构,那上层的逻辑就会受影响。前期在开发前一定要把这些东西讨论清楚。
前面提到了DDL(定义)、DML(操纵)、DCL(控制),那么本篇中表的操作属于哪一个呢?
注意,表的操作都是属于定义表结构的范畴,所以是DDL。
建库、建表都是对库、表的结构做操作,并没有对表中的内容做操作,所以都是DDL。
关于表的操作,该讲的都讲了,后续会对本篇中的一些坑做补充。
到此结束。。。