快捷搜索:
来自 网络数据库 2019-10-02 06:33 的文章
当前位置: 67677新澳门手机版 > 网络数据库 > 正文

Mysql - 触发器/视图

 

delimiter $
DROP TRIGGER IF EXISTS tg_update_all ; 
CREATE TRIGGER tg_update_all AFTER UPDATE ON tch_teacher FOR EACH ROW
BEGIN
IF new.isdeleted = 1 THEN
    DELETE FROM tch_all WHERE id = old.id ;
ELSE
    UPDATE tch_all set sex=new.sex, bid=new.bid, NO=new.NO, NAME=new.NAME where id = old.id;
END IF ;
END$
delimiter ;

事例中, 我只用了一句话, 例子嘛, 简单就好. 其实在骨子里运用进度之中, 不会是这么轻便的. 例如说吧.

begin

过多时候, 由于数量重要, 不会一贯删除数据. 而是精选翻新数据状态来代表其已不复利用. 这里就用 isdeleted来代表, 0表示能用, 1表示不再使用.

此间有四个标题, 作者修改了数据, 那么自个儿怎么援引他们呢? 既然修改了数量, 那必然是有 修改前数据和修改后新数据 的引用的, 

这里本人动用到了二个东西:delimiter, 这几个在mysql中, 是用来划分的. 

单是就询问质量上的话, 小编以为依然触发器的不二秘技快一些. 终究触发器维护了一张新表, 何况新表能够建索引来升高查询速度. 就是维护起来比较麻烦.

是因为职业的涉及, 作者不可能动用项目中的数据库来做笔录, 那就融洽搞多少个表来娱乐吧. 先建三张表

譬喻是单个实践, 就无需加特别了. 

delimiter $
drop trigger if EXISTS tg_insert_all;
create trigger tg_insert_all after insert on tch_teacher for each ROW
BEGIN
  insert into tch_all(Sex,BId,NO,NAME) values(new.sex, new.bid, new.no, new.name);
end $
delimiter;
delimiter $
drop view if EXISTS v_all; -- 删除视图
create view v_all AS    -- 新建视图
select tch_teacher.*,tch_contact.QQ,tch_contact.Weixin,tch_contact.Phone from tch_teacher 
left join tch_contact on tch_teacher.Id=tch_contact.TId where tch_teacher.IsDeleted=0 $
delimiter;

"delimiter $" 到 "$ delimiter;" 之间的事物是独立的. 所以, 假设将触发器的本子和视图的本子放在三个剧本中去施行, 是能够实行的.

有插入后触发, 自然就有插入前触发, 只须求将after改成before就能够. 

  1. 接触格局 insert/update/delete

接触情势, 有插入/修改/删除 时触发. 例子中自己只写了插入触发其他二种方法的施用办法是和这些同样的.

  1. 语法

视图的功力: 简化查询, 升高查询速度.

  1. 原数据援用  old/new

 

此地平昔利用 old 来指向修改前的多少, new 指向修改后的数据. 这里的针对性, 是指向的tch_teacher中的数据, 不是tch_all的数据.

触发器在前边的系列中, 应用的真正没有多少, 没有章程的时候, 才会去用那一个. 因为那一个东西在早先时期并不怎么好爱惜, 也易于产生纷乱.

那边的触发器, 触发的机缘是在tch_teacher表数据插入之后. 也正是说, tch_teacher插入成功了以往, 才会向tch_all表插入数据. 这里有八个点须要注意下. 在tch_teacher插入成功后, 向tch_all插入的时候报错, 那么tch_teacher的新插数据就回被回滚.

 

create trigger 触发器名 before/after insert/update/delete on 表名 for each row

自己那边就因而触发器的章程, 来尊敬tch_all那张表. 例子不好, 重若是介绍功用, 见谅.

before触发, 则会先想tch_all插入数据, 再向tch_teacher插入数据. 插入进程中, 不管哪一步战败, 都会回滚数据. 所以无需担忧, 触发不成功的场馆下, 会不会招致冗余可能失实数据.

自家近年的品类中, 由于数据库设计(外人设计的)原因, 导致有些最简便意义, 查询起来, 都很麻烦和复杂. 牵涉表比相当多, 表与表之间又互有部分关系. 笔者想说, 那是本人见过的最不好的数据库设计了. 最后不可能, 公司架构师给了触发器的缓和方案.

一、触发器

CREATE TABLE `tch_teacher` (
    `Id` INT (11) NOT NULL AUTO_INCREMENT,
    `Sex` SMALLINT (6) DEFAULT NULL,
    `BId` VARCHAR (36) DEFAULT NULL,
    `No` VARCHAR (20) DEFAULT NULL,
    `Name` VARCHAR (30) DEFAULT NULL,
    `IsDeleted` bit (1) DEFAULT b '0' PRIMARY KEY (`Id`),
    KEY `Index_Sex` (`Sex`) USING BTREE,
    KEY `Index_BId` (`BId`) USING BTREE
) ENGINE = INNODB AUTO_INCREMENT = 21 DEFAULT CHARSET = latin1;

CREATE TABLE `tch_contact` (
    `Id` INT (11) NOT NULL AUTO_INCREMENT,
    `TId` INT (11) DEFAULT NULL,
    `QQ` VARCHAR (15) DEFAULT NULL,
    `Weixin` VARCHAR (50) DEFAULT NULL,
    `Phone` VARCHAR (15) DEFAULT NULL,
    PRIMARY KEY (`Id`),
    KEY `Index_TId` (`TId`) USING BTREE
) ENGINE = INNODB AUTO_INCREMENT = 11 DEFAULT CHARSET = latin1 COMMENT = '联系方式表';

CREATE TABLE tch_all (
    Id INT NOT NULL,
    Sex SMALLINT,
    BId VARCHAR (36),
    NO VARCHAR (20),
    NAME VARCHAR (30),
    QQ VARCHAR (15),
    Weixin VARCHAR (50),
    Phone VARCHAR (15)
) COMMENT '完整表';

end

  1. 触发时机 before/after

在品种中, 小编新建了一张关系表, 把一些必备的, 有效的涉及, 通过触发器的方法, 更新到一张表中, 并在这张表里面建了索引. 然后读取数据的时候, 就透过连日那张关系表, 去获取终极的管事数据. 看上去, 有一点类似于读写分离的赶脚, 但是这而不是多台数据库服务器间的.

老版本的mysql, 并不补助视图子查询, 然则新本子的mysql, 已经能支撑了.

二、视图

 

就地点那一个例子来说, 其实也能够选拔视图的主意, 去化解复杂的逻辑.

当本身更新tch_teacher的isdeleted的值为1的时候, 触发修改触发器, 在触发器中, 小编就须要看清 new.isdeleted的值, 从而选取是还是不是删除关系表中的数据.

 

到此处, 笔者开掘临近平昔不承接这一个例子的画龙点睛了, 好呢, 那就那样了.

 

 

本文由67677新澳门手机版发布于网络数据库,转载请注明出处:Mysql - 触发器/视图

关键词: