小汤学编程之MySQL(三)——约束、多表查询、事务和数据库其他操作

在这里插入图片描述

一、约束
1.主键约束     2.自动增长     3.非空约束     4.唯一约束     5.默认约束     6.外键约束     7.级联删除和级联更新     8.null删除和null更新
二、多表查询
1.笛卡尔积     2.内连接     3.左(外)连接     4.右(外)连接     5.子查询
三、事务
1.概念     2.操作     3.事务的特性ACID     4.事务的并发问题     5.事务的隔离级别
四、其他操作
1.添加用户     2.删除用户     3.修改密码     4.修改root密码     5.授予权限     6.查看权限     7.撤销权限     8.数据备份     9.数据还原


一、约束

1.主键约束

主键,又称主码,是表中一列或多列的组合。主键要求主键列的数据唯一,并且不允许为空,主键能够唯一地表识表中的一条记录。一个表只能有一个主键,但是可以是多列(复合主键)。
(1)创建表时添加

-- 方式一:直接在主键字段后标识
create table t(
	id int primary key ,
	name varchar(10)
);
-- 方式二:在后面专门定义,复合主键只能用此方法
create table t(
	id int,
	name varchar(10) ,
	primary key(id)
);

(2)在已存在的表中添加

alter table t modify id int primary key;
alter table t add constraint id_pri primary key (id);
-- 第二种方式可以自定义主键名称。

(3)删除主键约束

alter table t drop primary key;
2.自动增长

当某列是数值时,我们可以给这列设置,让它自动增长。一般跟数值类型的主键一起使用。关键字 auto_increment

添加自动增长以后,也同样可以对字段进行主动赋值。
如果手动赋值跳跃性,则后面会直接根据最大值++。

(1)创建表时添加

create table student(
	s_id int primary key auto_increment,
	s_name varchar(10) 
) auto_increment=10000 -- 设置自动增长从10000开始

-- 在已存在表中设置自动增长从10000开始
alter table student  auto_increment=10000;

(2)在已存在的表中添加

alter table student s_id int auto_increment;

(3)删除自增长

alter table student modify s_id int;
3.非空约束

定义表的时候限定为非空约束后则此字段不能有null值。
(1)创建表时添加

create table t(	 
	...
	stu_name varchar(10) not null
);

(2)在已存在的表中添加

alter table t modify stu_name varchar(10) not null;

(3)删除非空约束

alter table t modify stu_name varchar(10);
4.唯一约束

限定列数据不能有重复的值,null值可以重复。
(1)创建表时添加

create table t(	 
	...
	stu_name varchar(10) unique 
);

(2)在已存在的表中添加

alter table t modify stu_name varchar(10) unique;
alter table t add constraint name_unique unique(stu_name);
-- 后者可以自定义约束的名字。

(3)删除唯一约束

alter table t drop index stu_name;-- 通过列名来删除约束
alter table t drop index name_unique;-- 通过约束名来删除约束
5.默认约束

限制某列数据当没有给定值的时候使用指定的默认值,关键字是 default
(1)创建表时添加

create table t(	 
	...
	stu_age int default 18  
);

(2)在已存在的表中添加

alter table t modify stu_age int DEFAULT 18;

(3)删除默认约束

alter table t modify stu_age int;
6.外键约束

让表与表产生关系,从而保证数据的正确性。

创建完父表与字表的外键约束关系后,则子表的外键字段值如果不为null的话,则必须是主表中的存在值

建立好外键约束关系后,如果子表外键值使用了主表的一个值,则默认情况下主表的这个值不能删除或者改成别的值。如果不要这个默认操作需要在定义外键的时候设置。

(1)创建表时添加

create table score (
	s_id int ,
	s_name VARCHAR(10),
	s_socre int ,
	user_id int ,
    -- 指定字段user_id是外键,指向父表student表中的s_id字段,外键必须指向父表的主键
	-- constraint s_foreign 这里可以加上,给这个外键取个名字  
    FOREIGN KEY(user_id) references student(s_id)
 ); 

(2)在已存在的表中添加

alter table score add constraint score_foreign foreign key (user_id) references student(s_id);

(3)删除外键约束

alter table score drop foreign key score_foreign;

score_foreign为外键约束取的名字,如果没有手动取名则改为使用默认生成的约束即可。

7.级联删除和级联更新

当删除主表的数据时,子表的行为可以设置级联删除跟级联更新。
(1)创建子表添加外键时添加

create table score (
	s_id int ,
	s_name VARCHAR(10),
	s_socre int ,
	user_id int ,
    -- 设置外键时,级联删除跟级联更新
	FOREIGN KEY(user_id) references student(s_id) on delete cascade on update cascade 
 );

(2)在已存在的表中添加外键时添加

alter table score add constraint score_foreign foreign key (user_id) references student(s_id) on update cascade on delete cascade;
8.null删除和null更新

当删除主表的数据时,子表的行为可以设置null删除和null更新。
(1)创建子表添加外键时添加

create table score (
	s_id int ,
	s_name VARCHAR(10),
	s_socre int ,
	user_id int ,
    -- 设置外键时,set null删除跟set null更新
	FOREIGN KEY(user_id) references student(s_id) on delete set null on update set null 
);

(2)在已存在的表中添加外键时添加

alter table score add constraint score_foreign foreign key (user_id) references student(s_id) on update set null on delete set null;


二、多表查询

1.笛卡尔积
select * from student,score;

查询出来的数量等于A*B,这个现象被称为笛卡尔积,即取这两个集合的所有组成情况。

2.内连接
隐式内连接

通过 where 消除无用数据:

select * from student,score where student.s_id = score.user_id;
显式内连接
select * from student INNER JOIN score on student.s_id = score.user_id;
3.左(外)连接
select * from student left join score on student.s_id = score.user_id;
4.右(外)连接
select * from student right join score on student.s_id = score.user_id;

内连接是将两表都满足联系条件的列合并成一个表
外连接是将A表完全保留,再拼上满足联系条件的B表的列

5.子查询

查询中嵌套查询,称嵌套查询为子查询。

SELECT * FROM customers WHERE cust_id IN (SELECT order_num FROM orderitems WHERE prod_id='TNT2');


三、事务

1.概念

如果一个包含多个SQL步骤的业务操作,把这些操作放入一个事务中,这些操作要么同时成功,要么同时失败。

2.操作
开启事务
start transaction;-- 方式一
begin;-- 方式二
提交事务
commit;-- 方式一
commit work;-- 方式二
回滚事务
rollback;-- 方式一
rollback work;-- 方式二
  • MySQL中默认自动提交事务。
  • 可以通过SELECT @@autocommit; 查看事务的默认提交方式, 0 为手动提交, 1 为自动提交。
  • 修改默认提交方式:set @@autocommit = 1;
3.事务的特性(ACID)
特性说明
原子性是不可分割的最小操作单位,要么同时成功,要么同时失败。
一致性事务操作前后,数据总量不变。
隔离性多个事务之间。相互独立。
持久性当事务提交或回滚后,数据库会持久化的保存数据。
4.事务的并发问题
问题说明
脏读事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。
不可重复读事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致。
幻读事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了修改或者删除操作并提交,导致事务A多次读取同一数据时,莫名的多出了一些之前不存在数据,或者莫名的丢了一些数据。像发生了幻觉一样。
  • 不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。
  • 解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。
5.事务的隔离级别
事务隔离级别脏读不可重复读幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)
  1. MySQL默认隔离级别为可重复读 repeatable-read
  2. Oracle默认隔离级别是不可重复读 read-committed
  3. 串行化 Serializable 强制的进行排序,在每个读读数据行上添加共享锁。会导致大量超时现象和锁竞争。
  4. 隔离级别从小到大安全性越来越高,但是效率越来越低。
  5. 查询数据库隔离级别 select @@tx_isolation;
  6. 设置数据库隔离级别 set global transaction isolation level 级别字符串;


四、其他操作

1.添加用户
CREATE USER  '用户名'@'主机名' IDENTIFIED BY  '密码';
2.删除用户
DROP USER '用户名'@'主机名';
3.修改密码
SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码');
4.修改root密码

(1)打开第一个cmd窗口,停止mysql服务: net stop mysql
在这里插入图片描述
(2)无验证方式启动mysql:mysqld --skip-grant-tables
在这里插入图片描述
(3)打开新的cmd窗口,直接输入mysql命令,敲回车,就可以登录成功。
在这里插入图片描述
(4)接着运行use mysql;update user set password = password('你的新密码') where user = 'root';
在这里插入图片描述
(5)关闭2个CMD窗口
(6)打开任务管理器,手动结束mysqld.exe 的进程或者重启
在这里插入图片描述
(7)启动mysql服务
在这里插入图片描述
(8)使用新密码登录

5.授予权限
grant 权限列表 on 数据库名.表名  to  '用户名'@'主机名' identified by '密码' ;
  • 权限列表代表14种权限,分别为: select,insert,update,delete,create,drop,index,alter,grant 等, ALL 代表所有的。
  • 用户地址可以是localhost,可以使ip地址、机器名字、域名。也可以用’%'表示任何地址连接。
6.查看权限
SHOW GRANTS FOR '用户名'@'主机名';
7.撤销权限
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
8.数据备份

(1)cmd窗口方式

mysqldump -u用户名 -p密码 数据库的名称 > 保存的路径

(2)图形界面方式
(以Navicat Premium为例)
在这里插入图片描述
如上图操作将sql文件保存至妥当位置即可。

9.数据还原

(1)cmd窗口方式
①登录数据库:

mysql -u用户名 -p密码

②创建并使用数据库:

create database student
use student

③source 文件路径,导入数据

source d://a.sql

(2)图形界面方式
(以Navicat Premium为例)
①创建数据库(注意编码格式统一)。
在这里插入图片描述
②双击连接,右键选择 运行SQL文件。
在这里插入图片描述

③在本地文件中找到sql文件进行导入,点击开始即可。
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值