• MySQL约束事务视图和存储过程


    约束

    非空约束

    not null
    

    默认约束

    default
    

    主键约束

    primary key
    

    唯一约束

    unique
    

    检查约束

    check mysql不支持检查约束,不报错但是无效果
    

    外键约束

    foreign key
    
    CREATE TABLE EmpInfo(
       EmpID INT PRIMARY KEY AUTO_INCREMENT,	主键约束
       EmpName VARCHAR(20) NOT NULL,	非空约束
       EmpSex VARCHAR(2) NOT NULL DEFAULT '男',	默认约束
       EmpBirth DATETIME NOT NULL,	
       EmpTel VARCHAR(20) NOT NULL UNIQUE,	唯一约束
       DeptID VARCHAR(10) NOT NULL,
       CONSTRAINT FK_DeptID FOREIGN KEY(DeptID) REFERENCES DeptInfo(DeptID)	外键约束
    )ENGINE=INNODB CHARSET=utf8 AUTO_INCREMENT=1001;
    

    事务

    事务的ACID属性

    原子性:事务是一组不可再分的业务逻辑单元,要么全部执行,要么全部不执行
    
    一致性:事务使数据从一个一致状态切换到另外一个一致的状态
    
    隔离性:事务的执行不受其他事务的干扰
    
    持久性:一个事务一旦提交则不能反悔
    

    事务并发问题

    脏读
    读到了别人还未提交的数据
    
    不可重复读(修改)
    前后读取,数据内容不一致,操作过于频繁,每次拿到的都是新的数据,主要是修改引发的
    
    幻读(插入/删除)
    前后读取,数据的条数不一致,主要是插入和删除引起的
    

    事务隔离级别

    读未提交
    会产生脏数据(脏读)
    
    读已提交【SQLServer默认隔离级别】
    解决了脏读问题,但是未解决不可重复读和幻读
    
    可重复读【MySQL的默认隔离级别】
    解决了脏读,不可重复读和幻读
    
    串行读
    会出现等待的情况
    

    视图

    (1)视图是一张虚拟的表,和普通标一样的使用方法
    (2)视图只保存了SQL逻辑,但是没有保存查询结果
    
    应用场景:
    -- 多个地方用到同样的查询结果
    -- 该sql查询语句比较复杂
    

    视图的创建

    语法:
    create view 视图名
    as
    查询语句;
    
    -- 视图的创建
    create view myv1
    as
    select * from student;
    
    select * from myv1 where score between 80 and 100;
    

    视图的修改

    语法1:
    create or replace view 视图名
    as
    查询语句;
    
    语法2:
    alter view 视图名
    as
    查询语句;
    
    -- 视图的修改
    -- (1)
    create or replace view myv1
    as
    select * from student where score between 80 and 100;
    
    select * from myv1;
    
    -- (2)
    alter view myv1
    as 
    select * from student where score between 60 and 80;
    
    select * from myv1;
    

    视图的删除

    语法:
    drop view 视图名,视图名,……;
    

    视图的查看

    (1)desc 视图名;
    
    (2)show create view 视图名;[可视化界面显示效果不好]
    可以使用:show create view 视图名G;[命令行使用]
    

    存储过程

    存储过程是一组预先编译好的SQL语句的集合(批处理语句)
    
    好处:(存储过程类似于java中的方法)
    (1)提高了代码的重用性
    (2)简化操作
    (3)减少编译次数,并且减少和数据库连接的次数,提高效率
    

    存储过程的创建

    语法:
    create procedure 存储过程名(参数列表)
    begin
    	存储过程体(一组合法的SQL语句)
    end
    
    注意:
    参数列表包含三部分:参数模式	参数名	参数类型
    	例如:in name varchar(50)
    	
    参数模式:
    in:输入,该参数需要调用放传入值
    out:输出,改参数作为返回值
    inout,既可以做输入也可以做输出,既可以传入值,也可以返回值
    
    存储过程体:
    (1)如果只有一句话,可以省略begin end
    (2)多条SQL语句,每条结尾必须加分号;存储过程的结尾可以使用delimiter重新设置
    语法:
    delimiter 结束标记
    案例
    delimiter $
    
    调用:call 存储过程名(实参列表);
    
    -- 视图的创建
    create view myv1
    as
    select * from student;
    
    select * from myv1 where score between 80 and 100;
    
    -- 视图的修改
    -- (1)
    create or replace view myv1
    as
    select * from student where score between 80 and 100;
    
    select * from myv1;
    
    -- (2)
    alter view myv1
    as 
    select * from student where score between 60 and 80;
    
    select * from myv1;
    
    -- 存储过程的创建
    -- (1)空参列表
    delimiter $
    create procedure myp1()
    begin
    	insert into student
    	values(6,53),(7,88),(8,72);
    end
    $
    
    call myp1();
    
    -- (2)有参列表
    delimiter $
    create procedure myp2(in inId int)
    begin
    	select * from student where id = inId;	
    end
    $
    
    call myp2(3);
    
    -- 实例:创建存储过程,判断用户是否登录成功
    delimiter $
    create procedure myp3(in uname varchar(20),in upwd varchar(20))
    begin
    	declare result int default 0; # 声明并初始化
    	
    	select count(*) into result # 赋值
    	from `user` u
    	where u.uname = uname and u.upwd = upwds
    	
    	select if(result > 0, '成功', '失败')
    end
    $
    
    call myp3('张三','123456');
    
    -- (3)out参数
    delimiter $
    create procedure myp4(in inId int,out outScore int) 
    begin
    	select score into outScore
    	from student 
    	where id = inID;
    end
    $
    
    call myp4(1,@outScore);	# @outScore是用户变量
    select @outScore;
    
    -- inout一样的用法就不举例了
    

    存储过程的删除

    drop procedure 存储过程名;
    -- 不支持一次删除多个存储过程
    

    存储过程的查看

    desc 存储过程名; # 不支持,报错
    show create procedure 存储过程名;
    
  • 相关阅读:
    C语言-typedef和#define
    C语言-指针
    C语言-数据结构-结构体
    数据结构笔记
    树的存储结构
    树的基本知识
    关于矩阵
    LaTex
    札记-碎碎念
    一个大神的个人博客 博客桌面风格很棒 二次元
  • 原文地址:https://www.cnblogs.com/IT_CH/p/13451151.html
Copyright © 2020-2023  润新知