【MySQL】表的操作

文章目录

  • [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 表名

演示一下:


注:修改和删除操作不要随便做(太底层了,实际开发中一旦改了上层的很多逻辑可能都需要修改)

相关推荐
合方圆~小文2 分钟前
工业摄像头工作原理与核心特性
数据库·人工智能·模块测试
jmxwzy7 分钟前
Redis
数据库·redis·缓存
零叹10 分钟前
Redis热Key——大厂是怎么解决的
数据库·redis·缓存·热key
王五周八11 分钟前
基于 Redis+Redisson 实现分布式高可用编码生成器
数据库·redis·分布式
win x13 分钟前
Redis事务
数据库·redis·缓存
飞翔的小->子>弹->14 分钟前
CMK、CEK
服务器·数据库·oracle
peixiuhui19 分钟前
Iotgateway技术手册-7. 数据库设计
数据库·iotgateway·开源dotnet·arm工控板·开源网关软件·开源数据采集
麦兜*26 分钟前
【Spring Boot】 接口性能优化“十板斧”:从数据库连接到 JVM 调优的全链路提升
java·大数据·数据库·spring boot·后端·spring cloud·性能优化
qq_3344668633 分钟前
U9补丁同步的时候报错
数据库
施嘉伟36 分钟前
KSQL Developer 测试记录
数据库·kingbase