首先,这个标题和百度知道的是一样的,我只是详细说明和记录。
看这张图,有三个表(当然,都是精简过了的),评论表,图片表,图片对应的评论表,关于外键索引就不说了,这里关键的是下面的触发器Triggers。这个的用处是,当我在需要插入一条评论时,不需要程序去更新图片表中的comment_count字段,而要做的只是将关联表插入一下就完成了。
触发器如下,很简单的。
DELIMITER $$
USE `mydb`$$
CREATE TRIGGER `picture_has_comment_ADEL` AFTER DELETE ON picture_has_comment FOR EACH ROW
-- 删除之后触发
BEGIN
UPDATE `picture` SET `comment_count` = `comment_count`-1 WHERE `id` = OLD.`picture_id`;
END;$$
CREATE TRIGGER `picture_has_comment_AINS` AFTER INSERT ON picture_has_comment FOR EACH ROW
-- 插入之后触发
BEGIN
UPDATE `picture` SET `comment_count` = `comment_count`+1 WHERE `id` = NEW.`picture_id`;
END
$$
USE `mydb`$$
CREATE TRIGGER `picture_has_comment_ADEL` AFTER DELETE ON picture_has_comment FOR EACH ROW
-- 删除之后触发
BEGIN
UPDATE `picture` SET `comment_count` = `comment_count`-1 WHERE `id` = OLD.`picture_id`;
END;$$
CREATE TRIGGER `picture_has_comment_AINS` AFTER INSERT ON picture_has_comment FOR EACH ROW
-- 插入之后触发
BEGIN
UPDATE `picture` SET `comment_count` = `comment_count`+1 WHERE `id` = NEW.`picture_id`;
END
$$
现在遇到的问题就是我对关联表picture_has_comment插入一个数据时,图片表能很好的反馈会信息,会对comment_count字段进行递增。
但是,当我使用级联操作时,就是当评论表删除的时候,关系表也会对应的删除数据,简单的说就是,删除一条评论,对应的关系也删除,而删除触发器的作用就是在评论被删除的时候自动让图片表中的comment_count数据减一,达到一个统计的目的,可是这个时候问题出现了。删除评论,会级联删除关系,但是触发器没有反应,就是触发器没有作用。
唯一的解决办法是什么呢,可以更换数据库,或者手动实现该关系表的删除,在删除评论之前。为了达到一致性,可以使用事务去处理。
为什么Mysql不支持呢?官方文档如此写的:目前,触发程序不会被级联的 外键动作激活。该限制将会被尽早放宽。,简单的说就是在Mysql 5上还是不支持这个操作,现在最新版本依旧不支持,不过不知道MariaDB是否支持啊。
这个SQL有点意思,整体的意思没怎么看懂。
刚看了下,貌似写错了
正在学习 mysql,不错的文章