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 中对应的文件也被删除了,这也是很显然的


总结

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

相关推荐
我的ID配享太庙呀13 分钟前
Django 科普介绍:从入门到了解其核心魅力
数据库·后端·python·mysql·django·sqlite
守望时空3314 分钟前
RustDesk搭建指南
linux
C++ 老炮儿的技术栈19 分钟前
在 Scintilla 中为 Squirrel 语言设置语法解析器的方法
linux·运维·c++·git·ubuntu·github·visual studio
java叶新东老师1 小时前
goland编写go语言导入自定义包出现: package xxx is not in GOROOT (/xxx/xxx) 的解决方案
开发语言·后端·golang
@蓝莓果粒茶1 小时前
LeetCode第350题_两个数组的交集II
c++·python·学习·算法·leetcode·职场和发展·c#
白鹭1 小时前
基于LNMP架构的分布式个人博客搭建
linux·运维·服务器·网络·分布式·apache
不辉放弃1 小时前
kafka的消费者负载均衡机制
数据库·分布式·kafka·负载均衡
拉姆哥的小屋1 小时前
用 Flask 打造宠物店线上平台:从 0 到 1 的全栈开发实践
数据库·oracle·flask
java叶新东老师1 小时前
linux 部署 flink 1.15.1 并提交作业
linux·运维·flink
liliangcsdn2 小时前
mac neo4j install & verifcation
数据库·neo4j