文章目录
- [1. 创建表](#1. 创建表)
- [2. 查看表结构](#2. 查看表结构)
- [3. 修改表](#3. 修改表)
-
- [3.1 修改表名](#3.1 修改表名)
- [3.2 新增列](#3.2 新增列)
- [3.3 修改某列的属性](#3.3 修改某列的属性)
- [3.4 删除列](#3.4 删除列)
- [3.5 修改列名](#3.5 修改列名)
- [4. 删除表](#4. 删除表)
上一篇文章我们学习了库的各种操作,那建好一个数据库,在数据库里面我们就可以建表,然后对表进行各种操作,所以这篇文章------表的操作
1. 创建表
语法:
sql
CREATE TABLE table_name (
field1 datatype,
field2 datatype,
field3 datatype
) character set 字符集 collate 校验规则 engine 存储引擎;
说明:
创建表也可以加[IF NOT EXISTS]
field 表示列名
datatype 表示列的类型
character set 字符集,如果没有指定字符集,则以所在数据库的字符集为准
collate 校验规则,如果没有指定校验规则,则以所在数据库的校验规则为准
engine 存储引擎 若不指明,以默认配置的为准
创建表案例:
sql
create table users (
id int,
name varchar(20) comment '用户名',
password char(32) comment '用户密码',
birthday date comment '生日'
) character set utf8 engine MyISAM;
解释一下:
创建一个表,表名为user,一共三列,分别是:
name:类型为变长字符串(数据类型我们后面也会专门讲解,这里大家先简单熟悉一下),comment后面的是对列名的文字说明
password:类型为32为定长字符串
birthday:类型为日期类型(注意最后一列后面没有逗号)
最后,指明了所用的字符集和存储引擎
我们来试一下:
我们先来建一个数据库user_db,在这个数据库里面操作
然后我们先建一个user1
同时,可以观察到,datadir里面对应的user_db目录下多了三个文件
然后再来建一个user2
跟user1的唯一区别就是存储引擎换成了InnoDB
同时,我们会发现
user2在对应目录下只生成了一个文件
那原因是什么呢?
就是因为这两个表所使用的存储引擎是不同的
即使用不同的存储引擎,创建表的文件不一样。
这跟我们后面要讲到的索引 有关系。
在我当前使用的MySQL下(默认存储引擎是InnoDB)
使用InnoDB,通常只有一个.ibd文件
对于MyISAM,会有.MYD、.MYI和.sdi文件
这个先了解一下,这里最重要的还是表的创建。
2. 查看表结构
先回忆一下:
前面我们讲过
select database();查看我们当前正在使用哪个数据库
show tables;查看当前数据库中有哪些表
那如何我想查看某个表的详细信息,查看表的结构,怎么做呢?
语法:
sql
desc 表名;//这里的desc是describe的缩写
试一下
除了前两列,有些字段大家现在可能看不懂,后面会讲到
但这好像不够详细啊,有些信息比如字符集,校验规则这些没有看到。那么,如何想查看表的更详细的信息:
sql
show create table 表名;
试一下:
另外,把;换成\G
可以格式化显示,把不需要的那些符号去掉
不过我们发现这里显示的和我们当时创建表的语句不完全一样,很正常,因为我们执行的sql语句,MySQL服务器收到后,会进行诸如词法分析、语法分析和一些调整优化等操作,它记录的是后者
3. 修改表
在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型,表的存储引擎等等。我们还有需求,添加字段,删除字段等等。这时我们就需要修改表。
语法:
sql
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);
大家可以先看下面的例子,再回头理解这里的语法。
案例:
首先补充一个------修改表名:
3.1 修改表名
语法:
sql
alter table 旧表名 rename to 新表名;//to可以省略
试一下:
比如我现在想把user1这个表名字改为user
alter table user1 rename to user
就修改成功了
对应的文件名也随之改变
然后我们来插入一些数据(插入后面也会详细讲)
先插入两条,查看一下
然后我们来看修改表的相关操作
3.2 新增列
现在我想在user表里面新增一列:
用到的语句就是我们上面语法中的
ADD:
ALTER TABLE tablename ADD (column datatype [DEFAULT expr][,column datatype]...);
我们来演示一下:
在users表添加一个字段(列),用于保存图片路径
alter table user add image_path varchar(128) comment '用户头像图片存放路径' after brithday;
解释一下:
并且我们发现
之前已经存在的两行数据(之前是没有这一列的),在新增一列之后,这一列的值默认是NULL。
即插入新字段后,对原来表中的数据没有影响(新增列默认为NULL)
3.3 修改某列的属性
修改,所以使用的就是modify
sql
ALTER TABLE tablename MODIfy (column datatype [DEFAULT expr][,column
datatype]...);
举个栗子:
name这一列的数据类型现在是varchar(20),我想改为varchar(60),怎么做呢?
alter table user modify name varchar(60);
就修改成功了
但是,如果我们再来查看建表语句的话
我们发现原来有的comment(列描述)消失了
这说明什么呢?
说明这里修改不是我们只写了修改类型,最终就只有列的类型会变,而是把新的相关属性覆盖式的修改(所以我们没有重新写comment,后面查看就没了)
所以,未来我们再修改某一列的某个属性,而不想其它属性发生变化的话,就把原来的属性复制一遍,然后只改动要修改的那一列。
比如:
要改变类型,但是剩余的复制一下之前的(保证它不会变)
3.4 删除列
删除,当然使用的就是drop
sql
ALTER TABLE tablename DROP (column);
现在user表中password这一列我不想要了,删除它,怎么做?
alter table user drop password;
注意:删除字段一定要小心使用,删除字段及其对应的列数据都没了
3.5 修改列名
我想修改表中某一列的名称,怎么做呢?
语法:
sql
alter table 表名 change 旧列名 新列名 varchar(60); --新字段需要完整定义
即你不仅要写新的列名称,列的属性你也要加上,比如换完列名你这一列的类型(必须指定)是什么,即使不变也要带上,还有comment(非必须加),你如果不写,那换完列名就默认是空了,如果原来就有,想保持不变,那就你直接复制原来的加上。
演示一下:
将name列修改为xingming
alter table user change name xingming varchar(50) DEFAULT NULL COMMENT '用户名';
不指明类型是不行的
这样就可以了
4. 删除表
语法:
sql
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...
TEMPORARY 关键字用于删除临时表。临时表是在当前会话中创建的表,它们只在当前会话可见,并且当会话结束时(或手动删除时)会自动删除。使用 TEMPORARY 关键字可以确保你只删除临时表,而不是同名的永久表。
一般就是直接:drop table 表名
演示一下:
注:修改和删除操作不要随便做(太底层了,实际开发中一旦改了上层的很多逻辑可能都需要修改)





























