Mysql 之 视图,触发器,存储过程,函数,事物,数据库锁,数据库备份

Mysql 之 视图,触发器,存储过程,函数,事物,数据库锁,数据库备份

阅读目录

一:视图

二:触发器

三:存储过程

四:函数

五:事物

六:数据库锁

七:数据库备份

一:视图

视图:是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据

视图有如下特点;
  1. 视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系。
  2. 视图是由基本表(实表)产生的表(虚表)。
  3. 视图的建立和删除不影响基本表。
  4. 对视图内容的更新(添加、删除和修改)直接影响基本表。
  5. 当视图来自多个基本表时,不允许添加和删除数据。

1.创建视图

create view 视图名称  as sql 查询语句  

2.使用视图

select * from 视图名称;

3.更新视图

alter view 视图名称 AS SQL语句

4. 删除视图

drop view ren_view;

二:触发器

触发器:监视某种情况,并触发某种操作。
触发器创建语法四要素:1.监视地点(table)
           2.监视事件(insert/update/delete)
             3.触发时间(after/before)
           4.触发事件(insert/update/delete)
1.创建触发器语法

create trigger triggerName  after/before  insert/update/delete
     on 表名 for each row #这句话是固定的
 begin
     #需要执行的sql语句
 end
注意1:after/before: 只能选一个 ,after 表示 后置触发, before 表示前置触发
注意2:insert/update/delete:只能选一个

创建两张表


#商品表

create table goods(

id int primary key auto_increment,

name varchar(20),

num int

);


#订单表

create table order_table(

oid int primary key auto_increment,

gid int,

much int

);

添加3条商品数据

insert into goods(name,num) values(‘商品1‘,10),(‘商品2‘,10),(‘商品3‘,10); 

如果我们在没使用触发器之前:假设我们现在卖了3个商品1,我们需要做两件事

1.往订单表插入一条记录

insert into order_table(gid,much) values(1,3);

2.更新商品表商品1的剩余数量

update goods set num=num-3 where id=1;

现在,我们来创建一个触发器:

create trigger tg1 after insert on  order_table
for each row
begin
  update goods set num = num -3 where id = 1;
end

这时候我们只要执行:

insert into order_table(gid,much) values(1,3);

会发现商品1的数量变为7了,说明在我们插入一条订单的时候,

触发器自动帮我们做了更新操作。

但现在会有一个问题,因为我们触发器里面num和id都是写死的,所以不管我们买哪个商品,最终更新的都是商品1的数量。

比如:我们往订单表再插入一条记录:

insert into order_table(gid,much) values(2,3);

执行完后会发现商品1的数量变4了,而商品2的数量没变,这样显然不是我们想要的结果。我们需要改改我们之前创建的触发器。

我们如何在触发器引用行的值,也就是说我们要得到我们新插入的订单记录中的gid或much的值。

对于insert而言,新插入的行用new来表示,行中的每一列的值用new.列名来表示。

所以现在我们可以这样来改我们的触发器:

create trigger tg2 after insert on order_table
for each row
begin
 update goods set num = num-new.much  where id = new.gid;
end

第二个触发器创建完毕,我们先把第一个触发器删掉

drop trigger tg1

再来测试一下,插入一条订单记录:

insert into order_table(gid,much) values(2,3)

执行完发现商品2的数量变为7了,现在就对了。

现在还存在两种情况:

1.当用户撤销一个订单的时候,我们这边直接删除一个订单,我们是不是需要把对应的商品数量再加回去呢?

对于delete而言:原本有一行,后来被删除,想引用被删除的这一行,用old来表示旧表中的值,old.列名可以引用原(旧)表中的值。

那我们的触发器就该这样写:

create trigger tg3 afert delete  on order_table
for each row
bigen
    update goods set num = num + old.much where id = old.gid;-- (注意这边的变化)
end

2.当用户修改一个订单的数量时,我们触发器修改怎么写

create trigger tg4 after update on order_table
for each row
begin
    update goods set num = num+old.much-new.much where id = old.gid;
end

  

三:存储过程

四:函数

五:事物

六:数据库锁

七:数据库备份

原文地址:https://www.cnblogs.com/twinkle-/p/10820825.html

时间: 2024-08-12 15:13:13

Mysql 之 视图,触发器,存储过程,函数,事物,数据库锁,数据库备份的相关文章

Mysql学习---视图/触发器/存储过程/函数/索引 180101

视图 视图: 视图是一个虚拟表(非真实存在),动态获取数据,仅仅能做查询操作 本质:[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用.由于视图是虚拟表,所以无法使用其对真实表进行创建.更新和删除操作,PyMysql是支持视图的. 仅能做查询用. 创建视图: create VIEW stu as select * from student; # 这里只是建立了一个对应关系,视图是虚表,动态获取数据 select * from stu;

视图 触发器 存储过程 函数 流程过程 索引 慢查询

视图 触发器 存储过程 函数 流程过程 索引 慢查询 视图 触发器 事务 存储过程 内置函数 流程控制 索引 视图 1.什么是视图 ? 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 ? 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id; 强调

mysql 查询表,视图,触发器,函数,存储过程

1. mysql查询所有表: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名' AND  TABLE_TYPE ='BASE TABLE' mysql查询建表语句: show create table `表名` 2.mysql查询所有视图: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名'

Mysql之视图 触发器 事务 存储过程 函数

视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用 #两张有关系的表 mysql> se

数据库 --- 40 视图 触发器 存储过程 事务 函数

一.视图  (view) 视图是一种虚拟表,可以把查询出来的临时表保存下来 1.创建视图 2.删除视图 3.修改视图,(原始表的记录也跟着修改) 4.查看视图 二.  触发器(trigger)可进行  增删改  操作 1.创建触发器 2.删除触发器 实例: 三.存储过程  1. 优点: 缺点: 2.程序与数据库结合使用的三种方式 3.创建简单存储过程(无参) 4.创建存储过程(有参) ① in  传入参数 ② out  返回值 #查看存储过程的一些信息:show create procedure

MySQL拓展 视图,触发器,事务,存储过程,内置函数,流程控制,索引,慢查询优化

视图: 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图 create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id; 强调: (1)在硬盘中,视图只有表结构文件,没有表结构数据 (2)视图通常是用于查询,尽量不要修改视图中的数据 dro

视图 触发器 事务 函数 存储过程

1.视图 视图是一个虚拟表(非真实存在).使用视图我们可以把查询过程中的临时表摘出来,用视图去实现. 视图有明显的效率问题,而且使用视图会过分依赖视图,强耦合,这样意味着扩展sql极为不便,因此不推荐使用 创建视图,使用视图 DROP VIEW teacher_view 删除视图 DROP VIEW teacher_view 2.使用触发器可以定制用户对某张表进行增删改操作前后的行为,注意:没有查询 delimiter // create trigger t1 BEFORE INSERT on

MySql中的视图 触发器 存储过程,以及事物

视图: 一个临时表被反复使用的时候,对这个临时表起一个别名,方便以后使用,就可以创建一个视图,别名就是视图的名称.视图只是一个虚拟的表,其中的数据是动态的从物理表中读出来的,所以物理表的变更回改变视图. 创建: create view v1 as SQL 例如:create view v1 as select * from student where sid<10 创建后如果使用mysql终端可以看到一个叫v1的表,如果用navicate可以在视图中看到生成了一个v1的视图 再次使用时,可以直接

MySQL之视图、存储过程、触发器、函数、事务、动态执行SQL

视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. 创建视图: create view v1 as select * from student where id > 100; 今后可以直接通过: select * from v1;   #直接访问学生ID大于100的信息 删除视图: drop view v1; 修改视图: alter view v1 as select id,name f

字符集,索引,视图,存储过程函数,变量,条件,光标,流程,事件,触发器

/*********************字符集(character)与校对规则(collation)****************************/ 说明:字符集用来定义MySQL存储字符串的方式,校对规则用来定义比较字符串的方式:MySQL支持不同服务器,不同数据库,不同的表,不同的字段指定不同的字符集:一种字符集可以对应多种校对规则 创建对象时指定字符集,校对规则可以查看help craete object: 查看所有可用字符集: show character set; des