MySQL in Centos 7
Part3+Part4:数据库、数据表的基本操作
教材:《MySQL5.7从入门到精通》
date:2020/3/21 goal: part3+part4
一开始,我以为、我以为、每一章节不会花很多时间,于是将目标订为2章。
结果,hhh,自己订下的目标,瘫着也要把它做完!
虽然完成了,但是代价惨重:
我的兴趣爱好又远离了我一步!
Mysql安装完毕,版本5.6。
进入centos终端(用dos界面也行,但我不怎么会)(输入su之后输入密码可获取终端的管理员权限)
输入命令:mysql -u root -p
终端会弹出password:
输入密码即可(初次安装完无需输入密码,直接回车就行,更改密码后才需输入)
ps:1.在mysql内,命令结束一定要加分号
2.文中语法规则中的<>在实际操作时不写出来,但是()要写出来。
第三章、数据库的基本操作
数据库:
show databases; 查看当前所有存在的数据库
create database name; 创建名为name的数据库
show create database name; 查看名为name的数据库的定义
drop database name; 删除名为name的数据库
show engines; 查看系统所支持的存储引擎类型
show variables like ‘storage_engine’; 查看系统默认搜索引擎
图:系统所支持的存储引擎类型
简要叙述一下几种存储引擎:
InnoDB: 事务型数据库的首选引擎,支持事物安全表(ACID),支持行锁定和外键。MySQL5.5.5以后,InnoDB作为默认存储引擎。
MyISAM: 基于ISAM的存储引擎并进行了拓展。是web、数据存储和其它应用环境下最常使用的存储引擎之一。它拥有较高的插入查询速度,但不支持事物 。
MEMORY: 将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问。
这些东西也看不太懂,至于引擎的选择,现在应该还和我关系不大。
第三章到此结束!
第四章、数据表的基本操作
4.1创建数据表:
语法规则:
use name; 进入(声明、指定、你怎么理解都行)名为name的数据库
create table table_name
(
字段名1 数据类型 (列级别约束条件) [默认值],
…… …… …… ……,
字段名n 数据类型 (列级别约束条件) [默认值],
)#是小括号不是花括号...
我要在mybase数据库中创建一个myself的表格,那么:
create database mybase;
use mybase;
create table myself
(
id int(11),
name varchar(25),
age int(6)
);
字段名 | 数据类型 | 备注 |
id | int(11) | 编号 |
name | varchar(25) | 名称 |
age | int(6) | 年龄 |
约束:
使用主键约束:又称主码,是表中一列或多列的组合。主键约束要求主键的数据唯一且不为空。通过主键能够唯一的识别表中的一条记录,主键可以结合外键来定义不同数据表之间的关系。
主键->某条记录 相当于 身份证->某个人
主键主要分为:单字段主键和多字段联合主键。
1.单字段主键:
语法规则:
<字段名> <数据类型> primary key, 定义某一列时将其指定为主键
constraint <约束名> primary key(字段名) 定义列结束后再将某列指定为主键。
- <字段名> <数据类型> primary key, 定义某一列时将其指定为主键
- constraint <约束名> primary key(字段名) 定义列结束后再将某列指定为主键。
一般 ‘constraint 约束名’ 可以不写
例子:
2.多字段联合主键:
主键由多个字段联合组成。
比如之前的表,可以通过字段名id(编号)唯一确定一个人。如果表中没有id项,那么就可能需要多个字段联合起来才能唯一确定一个人。
语法规则:只能在定义列结束后声明。
primary key (字段名1,字段名2...字段名n)
例子:通过地址和名称来确定唯一结果
使用外键约束:
外键用来在两个表的数据之间建立链接,它可以是一列或者多列。即一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以是空值,如果不为空,则每个外键值必须等于另一个表中主键的某个值。
外键:首先它是表中的一个字段,它既可以是本表的主键,也可以不是,但对应另外一个表的主键。
主表(父表):对于两个具有关联关系的表来说,相关联关键字是主键的那个表;
从表(子表):对于两个具有关联关系的表来说,想关联关键字是外键的那个表。
语法规则:
constraint <外键约束名> foreign key (字段名1,字段名2,...) references<主表名>(主键字段名1,主键2,....)
*翻译一下:约束名’a’ 外键是b,依赖于c主表的d主键
*这里的外键约束名是自己定义的,不是从表外键、主表主键、关联字段的名称
员工表的deptid(员工的部门编号)不是本表主键,但可以指定为外键
部门表(表中是给给部门)的id(部门编号)是本表主键
以上语句成功执行后,worker表就有了一个名为waijianname的外键约束,外键名称(在从表即本表worker中的字段名)为deptid,其依赖于主键(主表depts字段名)名称id。
非空约束:在定义列时,后面加一句not null 可添加非空约束,该字段不能为空值。
唯一约束:在定义列时,后面加一句 unique 可添加唯一约束,该字段的列唯一,允许为空但只能有一个空值。
这里注意unique和primary key的区别:
unique约束可以有多个,但是primary key约束只能有一个。
primary key不是有联合主键约束吗?那不就是多个吗? 不是的。primary key 是指“约束”,这个约束只有一个,但是在这个约束下的字段可以有多个。即 很多字段对应着一个primary key约束,但是对unique来说,很多字段可以各自对应一个unique约束。
也不知道我理解的对不对,肯定对啦~ _(:з」∠)_
默认约束:
- 在定义列时,后面加一句 default 默认值 可添加默认约束。
- 定义列结束时,
constraint <自己定义的约束名> unique(<字段名>)
设置表的属性值自动增加:
在定义完主键的后面加上 auto_increment,一个表只能有一个字段使用auto_increment,并且该字段必须是主键的一部分。
4.2查询数据表结构
show tables 查看所有数据表
desc tablename 查看表的结构desc全拼describe
show create table tablename 查看创建表时的命令语句,tablename后加\G会使结果更直观布局有条理
这里出现了ERROR:No query specified 并不影响结果,出现的原因是\G后面加了分号,去掉即可。
4.3修改数据表
4.3.1修改表名
alter table <旧表名> rename to <新表名> to可有可无
4.3.2修改字段数据类型
alter table <表名> modify <字段> <新的数据类型>;
4.3.3修改字段名
alter table <表名> change <旧字段名> <新字段名> <新数据类型>;
如果不需要改数据类型,就填和之前一样的,但是,新数据类型不能为空。
4.3.4添加字段
alter table <表名> add <新字段名> <数据类型> 约束条件 first 或者 after <已有字段名>;
最后的first 、after <已有字段名>二选一,分别指:添加到第一行,添加到某已有字段后面。
4.3.5删除字段
alter table <表名> drop <字段名> ;
4.3.6 修改字段的相对位置
alter table <表名> modify <字段名> <数据类型> first或者after<某字段名>;
很像修改?添加字段名的规则。
4.3.7修改表的存储引擎
alter table <表名> engine=<引擎名>;
4.3.8删除表的外键约束
alter table <表名> drop foreign key <外键约束名>;
但是 desc该表,deptid对应的key仍是mul:
这里有点疑惑,为什么呢?会有什么影响吗?
4.4删除数据表
4.4.1删除没有被关联的表
drop table if exists <表1> <表2>...<表n>;
if exists 是为了判断表是否存在,如果不加if exists 且其中某个表不存在,则会报错error。
加上之后即使有空表sql语句也会顺利执行,只是会warning。
这里补充一点,以后可能会学到,但是现在就要用,因此百度来了这么一条(给已创建好的表添加外键约束):
语法:
alter table <需加外键的表> add constraint <外键名> foreign key(需加外键表的字段名) references <关联表名>(关联字段名);
注意:外键名不能重复
重新将其关联起来的目的是为了试一下这个删除无关联表的命令。
我还以为这个语句能自动识别后面跟的列表中的无关联列表然后删除,看来我想多了。需要自己分辨。
接下来尝试这条删除语句:
第一次 加入了所有列表,包含相关联的主表和从表,结果error提示不能删除或更新一个父表。(这时我以为一个都没删掉)
于是打算在第二次尝试时去除depts,但是去除错了,把woker去掉了。最终结果还成功了...为什么?
再show tables;结果为空。
当时我很疑惑,我以为error就代表着没有执行,那按理说两条命令后worker表应该存在啊?
实际上,第二次有四个warnings,说明有四个空表,即,虽然第一条命令报错了,但它确实成功删除了几个表。
经过接下来‘4.4.2删除被其他表关联的主表’的知识,结果已经十分清晰了。
因为两个表关联,那么第一次直接删除主表会失败,所以第一次没有删除掉depts。
但是worker不受限制,所以和其他没有关联的表一并被删除掉了,即第一次尽管error了,但是删除了除父表depts以外的所有表。
第二次时,子表已经不存在了,外键约束也就没了,子表和父表的关联也就没了,因此depts是个无关联的表,自然也被删除了。
至此,所有列表都被删除了。
4.4.2删除被其他表关联的主表
上面我阴差阳错的删除了关联的父表,这也算是一种方法,但是有时要保留子表,这个方法便不再可行。
可以采用下面的方法:
先删除外键约束,再删除‘父表’,保留‘子表’。
alter table <表名> drop foreign key <外键约束名>;
drop table <原父表>;
一些建议:
第四章到此结束!
Mission accomplished