Mysql - 触发器/视图
触发器在之前的项目中, 应用的着实不多, 没有办法的时候, 才会去用这个. 因为这个东西在后期并不怎么好维护, 也容易造成紊乱.
我最近的项目中, 由于数据库设计(别人设计的)原因, 导致一些最简单功能, 查询起来, 都很麻烦和复杂. 牵涉表非常多, 表与表之间又互有部分关系. 我想说, 这是我见过的最糟糕的数据库设计了. 最后没办法, 公司架构师给了触发器的解决方案.
一、触发器
在项目中, 我新建了一张关系表, 把一些必要的, 有效的关系, 通过触发器的方式, 更新到一张表中, 并在这张表里面建了索引. 然后读取数据的时候, 就通过连接这张关系表, 去得到最后的有效数据. 看上去, 有点类似于读写分离的赶脚, 不过这并不是多台数据库服务器间的.
由于工作的关系, 我不能使用项目中的数据库来做记录, 那就自己搞几个表来玩玩吧. 先建三张表
复制代码
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 '完整表';
复制代码
我这里就通过触发器的方式, 来维护tch_all这张表. 例子不好, 主要是介绍功能, 见谅.
复制代码
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;
复制代码
1. 语法
create trigger 触发器名 before/after insert/update/delete on 表名 for each row
begin
end
本文选自热饭论坛