创建一篇文章,然后需要审核才能正式发布,这是一个非常常见的规则。本文就介绍使用MySQL触发器来统计各个分类/栏目下的未审核文章数量。
首先有一个文章表,test_article,还一个分类表,test_cate。文章表中有一个a_is_checked字段,表示是否已审核,已审核值为1,未审核值为0。分类表中有一个c_unchecked_num字段来统计该分类下的未审核文章数。
创建时的文章默认是未审核的,所以给一个insert触发器,把新增文章对的分类记录的c_unchecked_num加1。
2、文章删除
删除文章时,要分情况。如果是删除已审核的,则计数不变。如果是删除未审核的,则对应分类的c_unchecked_num减1。
3、文章修改
这个就比较复杂了,得要分情况。先看看是否有修改文章的分类,如果没修改分类,那审核文章,则c_unchecked_num减1;把已审核的文章再设置成未审核,则c_unchecked_num加1。如果修改了分类,审核文章则新分类不受影响,旧分类下c_unchecked_num加1;把已审核的文章再设置成未审核,则新分类c_unchecked_num加1,旧分类不受影响。
完整的SQL语句如下:
-- -----------------
-- 分类
-- -----------------
DROP TABLE IF EXISTS `test_cate`;
CREATE TABLE `test_cate` (
`c_id` int(11) NOT NULL AUTO_INCREMENT,
`c_name` varchar(20) NOT NULL DEFAULT '' COMMENT '名称',
`c_unchecked_num` int(11) NOT NULL DEFAULT '0' COMMENT '未审核数量',
PRIMARY KEY (`c_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT '分类';
-- -----------------
-- 文章
-- -----------------
DROP TABLE IF EXISTS `test_article`;
CREATE TABLE `test_article` (
`a_id` int(11) NOT NULL AUTO_INCREMENT,
`a_name` varchar(20) NOT NULL DEFAULT '' COMMENT '名称',
`cate_id` int(11) NOT NULL DEFAULT '0' COMMENT '关联分类表的ID',
`a_is_checked` int(1) NOT NULL DEFAULT '0' COMMENT '是否审核',
PRIMARY KEY (`a_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT '文章';
DELIMITER //
-- 插入
DROP TRIGGER IF EXISTS `article_insert`;
CREATE TRIGGER article_insert AFTER INSERT ON test_article
FOR EACH ROW BEGIN
UPDATE test_cate SET c_unchecked_num=c_unchecked_num+1 WHERE c_id=NEW.cate_id;
END//
-- 审核
DROP TRIGGER IF EXISTS `article_update`;
CREATE TRIGGER article_update AFTER UPDATE ON test_article
FOR EACH ROW BEGIN
IF NEW.cate_id=OLD.cate_id THEN -- 没改分类
IF OLD.a_is_checked=0 THEN -- 原来是未审核
IF NEW.a_is_checked=1 THEN /*现在是已审核*/
UPDATE test_cate SET c_unchecked_num=c_unchecked_num-1 WHERE c_id=NEW.cate_id;
END IF;
ELSE /* 原来是已审核 */
IF NEW.a_is_checked=0 THEN -- 现在是未审核
UPDATE test_cate SET c_unchecked_num=c_unchecked_num+1 WHERE c_id=NEW.cate_id;
END IF;
END IF;
ELSE -- 修改了分类
IF OLD.a_is_checked=0 THEN -- 原来是未审核
IF NEW.a_is_checked=1 THEN -- 现在是已审核
-- 原分类-1
UPDATE test_cate SET c_unchecked_num=c_unchecked_num-1 WHERE c_id=OLD.cate_id;
ELSE -- 现在是未审核
-- 原分类-1,新分类+1
UPDATE test_cate SET c_unchecked_num=c_unchecked_num-1 WHERE c_id=OLD.cate_id;
UPDATE test_cate SET c_unchecked_num=c_unchecked_num+1 WHERE c_id=NEW.cate_id;
END IF;
ELSE /*原来是已审核*/
IF NEW.a_is_checked=0 THEN -- 现在是未审核
UPDATE test_cate SET c_unchecked_num=c_unchecked_num+1 WHERE c_id=NEW.cate_id;
END IF;
END IF;
END IF;
END//
-- 删除
DROP TRIGGER IF EXISTS `article_delete`;
CREATE TRIGGER article_delete AFTER DELETE ON test_article
FOR EACH ROW BEGIN
IF OLD.a_is_checked=0 THEN
UPDATE test_cate SET c_unchecked_num=c_unchecked_num-1 WHERE c_id=OLD.cate_id;
END IF;
END//
关于使用MySQL触发器搞定文章审核统计,本文就介绍这么多,希望对大家有所帮助!