MySQL表的操作(3)

文章目录


前言

Hello! 那我们乘胜追击,开始 表的操作!


一、创建表

首先创建一个 数据库 testForTable

sql 复制代码
mysql> create database if not exists testForTable;

当前创建的 数据库 testForTable 字符集和校验集分别为 utf8mb4 和 utf8mb4_unicode_ci,这是由配置文件中的默认编码集决定的

接下来创建一张表,具体语法为

sql 复制代码
CREATE TABLE [if not exists] tablename
(
	field1 datatype,
	field2 datatype,
	field3 datatype
) [character set 字符集] [collate 校验规则] [engine 存储引擎];

其中 字符集、校验规则、存储引擎 可以不用指定,默认使用当前数据库的默认属性

创建一张 person 表,包含 姓名、性别、年龄 三个字段

注意: 创建表之前需要先使用数据库

sql 复制代码
mysql> create table if not exists person 
(
	name varchar(16) comment '姓名',
	sex char(2) comment '性别,只能为男/女',
	age int unsigned comment '年龄,不能为负数'
);

这样就得到了一张 person 表,当前表的字符集为 utf8mb4,校验集为 utf8mb4_unicode_ci,存储引擎为 InnoDB,这些都是数据库的 默认属性,只要我们在创建表时不指定属性,表就会继承数据库的默认属性

通过 InnoDB 引擎创建的表会生成 一个文件(跟你的MySQL版本有关)

注意:

  • comment '内容' 表示注释,通常用来注明该字段的含义及用途
  • 在 MySQL 中定义无符号类型的数据,需要把 unsigned 放在类型之后修饰

创建表时指定属性

除了使用数据库的 默认属性,还可以在创建时指定属性,比如再创建一张 goods 表,表示商品信息,包含字段有 商品名、价格、数量、厂商,并且在创建表时,指定字符集为 gbk,校验集为 gdk_chinese_ci,存储引用选择 MyISAM

sql 复制代码
mysql> create table if not exists goods
(
	name varchar(32) comment '商品名称',
	price double(10, 2) unsigned comment '商品价格,最多支持小数点前 8 位数,小数点后 2 位数',
	num int unsigned comment '商品数量',
	factory varchar(64) comment '厂商名称'
) character set 'gbk' collate 'gbk_chinese_ci' engine 'MyISAM';

此时通过 MyISAM引擎 生成的表会创建三个文件

二、查看表

身处某个数据库中,可以通过 show tables 查看当前数据库中有哪些表

sql 复制代码
mysql> show tables;

比如说之前创建的两张表

查看表结构

知道有哪些表后,还需要进一步了解表的 结构 信息,比如有哪些字段,才能知道如何使用这张表,查看表的详细信息语法为

sql 复制代码
mysql> desc tablename

分别查看刚才创建的两张表的 结构 信息

sql 复制代码
mysql> desc person;
mysql> desc goods;

可以看到查询结果为一张行列构建的表,第一行表示各种属性信息,属性支持修改

  • Field 表示 列名
  • Type 表示 类型
  • Null 表示 是否可为空
  • Key 表示 是否存在 主键/外键/唯一键 约束
  • Default 表示 是否有默认值
  • Extra 表示 额外信息

查看建表消息

如果想查看关于表更详细的信息,可以通过指令查看建表时的语句内容,语法为

sql 复制代码
SHOW CREATE TABLE tablename
SHOW CREATE TABLE tablename \G

MySQL 会记录下用户的所有操作痕迹,这也是备份后,恢复数据库的关键,把所有指令再执行一遍,就能得到一模一样的数据库了

三、修改表

修改列属性

首先是新增字段,语法为

sql 复制代码
ALTER TABLE tablename ADD (column datatype [DEFAULT expr][,column datatype]...);

column 表示 列名,datatype 表示 类型,[DEFAULT expr] 表示该列的各种 属性,比如约束、默认值、是否为空等,支持同时新增多个字段

给 person 表新增 出生日期、爱好 两个字段

注意: 如果新增多个字段时,需要使用 ( ) 将新增的一批字段括起来

sql 复制代码
mysql> alter table person add (birthday date comment '生日', hobby varchar(32) comment '爱好');

新增的字段默认是紧跟最后一个字段的

如果想新增至指定字段之后,可以在语句后面加上 after column ,比如在 性别 sex 之后新增一个 籍贯 字段

注意: 只支持新增单个字段时,指定位置,也就是说 ( ) 与 after column 是冲突的,不能同时使用

sql 复制代码
mysql> alter table person add hometown varchar(16) comment '籍贯' after sex;

除了可以新增字段,还可以修改字段,语法为

sql 复制代码
ALTER TABLE tablename MODIFY column datatype [DEFAULT expr], [MODIFY ...];

注意:

  • 需要确保修改的字段存在,并且要保证修改后的字段类型与表中已经存在的数据类型相匹配
  • 修改多个字段时,可以叠加多条 MODIFY column datatype [DEFAULT expr] 语句,通过 , 分隔
  • 修改字段后,原字段的所有信息都会被覆盖,包括注释

修改 name 的类型为 varchar(32),修改 age 的类型为 int,因为此时是空表,所以可以随便修改

sql 复制代码
mysql> alter table person modify name varchar(32), modify age int;

可以看到,之前的注释没了,并且字段的类型也修改了

最后就是删除字段,语法为

sql 复制代码
ALTER TABLE tablename DROP (column), [DROP ...];

注意: 删除字段时,同样需要确保字段存在,字段被删除后,表中对应的数据也会被删除

先随便新增几个无用字段,再删除

sql 复制代码
mysql> alter table person add (a int, b int, c double);
mysql> alter table person drop a, drop b, drop c;

刚刚新增的无用字段立马就被删除了

在 MySQL 中,删除 一直都是一个 高危 操作,毕竟数据丢了不容易找回,比如这里的删除字段,如果表中有数据,那么表中数据关于该字段的信息会被全部删除,所以删除字段要 慎用

网上说的被裁什么删库跑路之类的看看笑话就行~

修改列名

列名是支持修改的,语法为

sql 复制代码
ALTER TABLE tablename CHANGE oldcolumn newcolumn datatype [DEFAULT expr];

注意: 修改需要确保字段存在,修改后,上层应用会受影响

比如把 goods 表中的 num 改为 nums

sql 复制代码
mysql> alter table goods change num nums int unsigned;

可以看到修改之后,注释也没了,这个操作也要 慎用,因为上层查询时,可能会查询失败,需要上层配合更新信息

修改表名

表名支持修改,语法为

sql 复制代码
ALTER TABLE oldname RENAME [TO] newname;

其中 TO 可以省略,修改成功后,Linux 中对应的文件名也会被修改

注意: 如同修改字段名一样,修改表名也是一个危险操作,同样会影响上层使用

修改 person 表名为 students

sql 复制代码
mysql> alter table person rename to students; 

可以看到,表对应的文件名,也被修改了


四、删除表

还是要提醒下,这很危险,非必要情况下请不要这么做

删除表的语法为

sql 复制代码
DROP TABLE tablename;

注意: 删除表很危险,删除之后,表中所有的数据就都没了,不要轻易删除!

删除 goods 表

sql 复制代码
mysql> drop table goods;

当然,删除成功后,Linux 中对应的文件也被删除了,这也是很显然的


总结

本篇有很多删除操作,数据库的恢复是相当麻烦的,甚至还有彻底无法恢复的可能,所以我们再进行修改乃至删除的时候务必要慎之又慎

相关推荐
CodeSheep1 天前
同事去年绩效是C,提离职领导死活不让走,后来领导私下说他走了,就没人背这个绩效了
前端·后端·程序员
怕浪猫1 天前
第19章:Go语言工具链与工程实践
后端·go·编程语言
BingoGo1 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·laravel
风象南1 天前
WHAT? AI把我仓库内容全删了!!!
后端
摸鱼的春哥1 天前
春哥的Agent通关秘籍12:本地RAG实战(中下)向量化与落库
前端·javascript·后端
JaguarJack1 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
摸鱼的春哥1 天前
专家实验让AI做战争决策,AI的选择太暴力了
前端·javascript·后端
Victor3561 天前
MongoDB(15) 如何在MongoDB中启用身份验证?
后端
Victor3561 天前
MongoDB(14)如何修改MongoDB的默认端口?
后端
怒放吧德德1 天前
Spring Boot 实战:RSA+AES 接口全链路加解密(防篡改 / 防重放)
java·spring boot·后端