MySql—变量、存储、函数、流程控制
- 变量
- 系统变量
- 自定义变量
- 存储过程
- 函数
- 流程控制
温故知新
#事务
一、含义
事务:一条或多条sql语句组成一个执行单位,一组sql语句要么都执行要么都不执行
二、特点(acid)
a:原子性:一个事务是不可在分割的整体,要么都不执行,要么都执行
c:一致性:一个事务可以是数据从一个一致状态切换到另一个一致的状态
i:隔离性:一个事务不受其他事务的干扰,多个事务相互隔离的
d:持久性:一个事务一旦提交了,则永久的持久化到本地
三、事务的使用步骤
了解:
隐式(自动)事务:
显式事务
使用事务:
1)开启事务
set autocommit =0;
start transaction;#可以省略
2)编写一组逻辑sql语句
注意:sql语句支持的是insert update delete
设置回滚点
savepoint 回滚点名;
3)结束事务
提交:commit;
回滚:rollback;
回滚到指定的地方:rollback to 回滚点名;
四、并发事务
1.事务的并发问题是如何发生的?
多个事务同时操作一个数据库的相同数据时
2.并发问题都有哪些?
脏读:一个事务读取了其他事务还没有提交的数据,读到的是其他事务“更新”的数据
不可重复读:一个事务多次读取,结果不一样
幻读:一个事务读取了其他事务还没有提交的数据,只是读到的是其他事务“插入”的数据
3.如何解决问题
通过设置隔离级别来解决并发问题
4.隔离级别
read uncommitted:读未提交
read committed:读已提交
repeatable read:可重复读
serializable:串行化
熟能生巧
#视图
#一、含义
mysql5.1版本出现的新特性,本身是一个虚拟表,它的数据来自于表,通过执行时动态生成。
好处:
1.简化了sql语句
2.提高了sql的重用性
3.保护基表的数据,提高了安全性
#二、创建
create view 视图名
as
查询语句;
#三、修改
方式一:
create or replace view 视图名
as
查询语句;
方式二:
alter view 视图名
as
查询语句;
#四、删除
drop view 视图1,视图2,....
#五、查看
desc 视图名;
show create view 视图名;
#六、使用
插入:insert
修改:update
删除:delete
查看:select
注意:视图一般用于查询的,而不是更新的,所以具备以下特点的视图都不允许更新
》包含分组函数、group by 、distinct、having 、union
》join
》常量视图
》where后的子查询用到了from 中的比表
》用到了不可更新的视图
#七、视图和表的对比
关键字 是否占用物理空间 使用
视图 view 占用较小,只保存sql逻辑 一般用于查询
表 table 保存实际的数据 增删改查
#####
#常见约束
一、常见的约束
not null:非空,该字段的值必填
unique:唯一,该字段的值不可重复
default:默认,该字段的值不用手动插入有默认值
check:检查,mysql不支持
primary key:主键,该字段的值不可重复并且非空(相当于 unique + not null)
foreign key :外键,该字段的值引用了另外的表的字段
主键和唯一
区别:一个表至多有一个主键,但可以有多个唯一
主键不允许为空,唯一可以为空
相同点:
都具有唯一性
都支持组合键,但不推荐
外键:
》用于限制两个表的关系,从表的字段值(外键列)引用了主表的某字段值(references列)
》外键列和主表的被引用列要求类型一致,意义一样,名称无要求
》主表的被引用列要求是一个key(一般就是主键)
》插入数据,先插入主表
删除数据,先删除从表
(#alter table 表名 drop foreign key fk_stuinfo_major[这是被删除的表中外键的名字];#删除外键
#alter table stuinfo add constraint fk_stu_major foreign key(major) references major(id);#添加外键
)
可以通过以下两种方式来删除主表的记录
#方式一:级联删除
alter table stuinfo add constraint fk_stu_major foreign key(majorid) on delete cascade;#先添加这样的外键
delete from major where id=3;#此时直接删除主表的信息也可以
#方式二:级联置空
alter table stuinfo add constraint fk_stu_major foreign key(majorid) on delete set null;#先添加这样的外键
delete from major where id=2;#id被置空
二、创建表时添加约束
create table 表名(
字段名 字段类型 not null,#非空
字段名 字段类型 primary key,#主键
字段名 字段类型 unique,#唯一
字段名 字段类型 default 值,#默认
constraint 约束名 foreign key(字段名) references 主表 (被引用列)
);
注意:
支持类型 可以起约束名
列级约束 除了外键 不可以
表级约束 除了非空和默认 可以,但对主键无效
列级约束可以在一个字段上追加多个,中间用空格隔开,没有顺序要求
表级约束也可以加多个,就在那个字段名最下面一条条加就可以
三、修改表时添加或删除约束
1.非空
添加非空
alter table 表名 modify column 字段名 字段类型 not null;
删除非空
alter table 表名 modify column 字段名 字段类型;
2.默认
添加默认
alter table 表名 modify column 字段名 字段类型 default 值;
删除默认
alter table 表名 modify column 字段名 字段类型;
3.主键
添加主键
alter table 表名 add 【constraint 约束名】primary key(字段名);
删除主键
alter table 表名 drop primary key;
4.唯一
添加唯一
alter table 表名 add 【constraint 约束名】 unique(字段名);
删除唯一
alter table 表名 drop index 索引名;
5.外键
添加外键
alter table 表名 add 【constraint 约束名】foreign key(字段名) references 主表(别引用列);
删除外键
alter table 表名 drop foreign key 约束名;
#四、自增长列
特点:
1.不用手动插入值,可以自动提供序列值,默认从1开始,步长为1
auto_increment_increment
如果要更改七十至:手动插入值
如果要更改步长:更改系统变量
set auto_increment_increment = 值;
2.一个表至多有一个自增长列
3.自增长列只能支持数值型
4.自增长列必须为一个key【这条只适用于mysql】
创建表时设置自增长列
create table 表(
字段名 字段类型 约束 auto_increment
);
修改表时设置自增长列
alter table 表 modify column 字段名 字段类型 约束 auto_increment
删除自增长列
alter table 表 modify column 字段名 字段类型 约束
变量
#变量
/*
系统变量:
全局变量
回话变量
自定义变量:
用户变量
局部变量
*/
#一、系统变量
/*
说明:变量由系统提供的,不是用户定义,属于服务器层面
注意:
如果是全局级别,则需要加global,如果是回话级别,则需要加session,如果不写,则默认session
使用语法:
1.查看所有的系统变量
show global|session variables;
2.查看满足条件的部分系统变量
show global|[session] variables like '%char%';
3.查看指定的某个系统变量的值
select @@gloable|[session].系统变量名;
4.为某个系统变量赋值
#方式一: