mysql 视图循环_mysql之视图,触发器,事务等

一、视图

视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集,可以将该结果集当做表来使用。

使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用

-- 1.视图是一个虚拟表(非正式存在),其本质是其本质是

-- 【根据SQL语句获取动态的数据集,并为其命名】,

-- 用户使用时只需使用【名称】即可获取结果集,

-- 可以将该结果集当做表来使用。

-- 2.

-- 有了视图以后你是不是觉得写sql语句就很简单了,但是你尽量不要这样做

-- 因为mysql是DBA管着呢,那么你告诉DBA建一堆视图,你写程序的时候是方便了,

-- 但是你要是修改呢,那么你就得修改视图了,你就得找到DBA修改你的视图了,

-- 那么这样联系别人会很麻烦的。说不定人家还很忙呢。还是推荐自己去写sql语句。

-- #注意:

-- 如果是一个单表的就可以修改或者删除或者插入

-- 如果是几个表关联的时候是不可以修改或者删除或者插入的(这点也是不确定的,有的可以改,有的不可以改)

准备表

========================创建部门表

create table dep(

id int primary key auto_increment,

name char(32)

);

创建用户表

create table user(

id int primary key auto_increment,

name char(32),

dep_id int,

foreign key(dep_id) references dep(id)

);

插数据

insert into dep(name) values('外交部'),('销售'),('财经部');

insert into user(name,dep_id) values ('egon',1),

('alex',2),

('haiyan',3);

1.创建视图

创建视图语法

CREATE VIEW 视图名称 AS SQL语句

create view teacher_view as select tid from teacher where tname='李平老师';

#连表

select * from dep left join user on dep.id =user.dep_id;#创建一个视图

create view user_dep_view as select dep.id depid ,user.id uid ,user.name uname,dep.name depname fromdep left join user

on dep.id=user.dep_id;--这样创建一个视图以后就可以吧一个虚拟表保存下来,就可以查看了。

select unamefrom user_dep_view where depid = 3;-- 我的电脑上不可以增删改,只可查看。但是有的电脑上又可以增删改,可能是跟版本有关吧#测试

insert into user_dep_view VALUES (1,2,'egon','人文部'); #会报错

DELETE from user_dep_view where uid = 1; #会报错

update user_dep_view set uname = '海燕' where depid = 2; #会报错

--对于单表来说是可以修改的,并且原来表的也就更改了。-- 但是一般还是不要这样改。视图大多数是用来查看的

#建表

CREATE TABLE t1(

id int PRIMARY KEY auto_increment,

name CHAR(10)

);#插入数据

insert into t1 VALUES (1,'egon'),

(2,'daa'),

(3,'eef');#创建视图

CREATE view t1_view as select * fromt1;#测试创建视图以后还能不能增删改查

select * fromt1_view;

update t1_view set name= '海燕' where id = 2; #可以修改(而且原来表的记录也修改了)

INSERT into t1_view values(4,'aaa'); #可以插入(同上)

delete from t1_view where id=3;#同上

2.修改视图

语法:ALTER VIEW 视图名称 AS SQL语句

3.删除视图

语法:DROP VIEW 视图名称

二、触发器

使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询

-- 触发器:某种程序触发了工具的运行

-- 触发器不能主动调用,只有触发了某种行为才会调用触发器的执行

-- 插入一条记录就触发一次

-- 还是建议不要用触发器,因为这是BDA管理的,还是不如你在程序里面直接写比较方便

1.创建触发器的语法

create

trigger trigger_name

trigger_time trigger_event

on tbl_nameforeach row

triggrr_body#主体,就是在触发器里干什么事

trigger_time:{before |after}

trigger_event:{insert| update |detele}

准备表

-- #2.准备表

-- #第一步:准备表

create table cmd_log(

id int primary key auto_increment,

cmd_name char(64), #命令的名字

sub_time datetime, #提交时间

user_name char(32), #是哪个用户过来执行这个命令

is_success enum('yes','no') #命令是否执行成功

);

create table err_log(

id int primary key auto_increment,

cname char(64), #命令的名字

stime datetime #提交时间

);

创建触发器

-- #创建触发器(向err_log表里插入最新的记录)

delimiter //create

trigger tri_after_inser_cmd_log

after insert

on cmd_logforeach row

BEGINif new.is_success = 'no'then

insert into err_log(cname,stime) VALUES(new.cmd_name,new.sub_time);

endif; #记得加分号,mysql一加分号代表结束,那么就得声明一下

END //delimiter ;#还原的最原始的状态

-- #创建触发器(向err_log表里插入最旧的记录)

delimiter //create

trigger tri_after_inser_cmd_log1

after delete

on cmd_logforeach row

BEGINif old.is_success = 'no'then

insert into err_log(cname,stime) VALUES(old.cmd_name,old.sub_time);

endif; #记得加分号,mysql一加分号代表结束,那么就得声明一下

END //delimiter ;#还原的最原始的状态

DELETE from cmd_log where id=1;

-- 触发器的两个关键字:new ,old

-- new :表示新的记录

-- old:表示旧的那条记录

-- 什么情

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值