创建一篇文章,然后需要审核才能正式发布,这是一个非常常见的规则。本文就介绍使用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触发器搞定文章审核统计,本文就介绍这么多,希望对大家有所帮助!

03-14 00:10