如何在MYSQL中创建触发器,当我在帖子中插入新评论时充当计数器

问题描述 投票:1回答:1

我想知道如何更新列[[numberOfComments”以显示帖子上发表的评论数。我可以在表comments上创建触发器并更新表posts中的列[[numberOfComments)吗?表格看起来像这样。

create table posts ( post_id int primary key, post_subject varchar(255), numberOfComments int); create table comments( comment_id int primary key, comment_text, post_id int, foreign key (post_id) references posts(post_id));
mysql database-trigger
1个回答
0
投票
但是为了回答您的问题,这是一个演示:

我创建了您在问题中显示的表格,然后在帖子中添加了一行:

insert into posts set post_id = 1, post_subject = 'subject';

这里是触发器:

create trigger updNumberOfComments after insert on comments 
for each row 
  update posts set numberOfComments = COALESCE(numberOfComments, 0) + 1 
  where post_id = NEW.post_id;

此触发器只是一个语句,因此我可以在没有BEGIN...END块的情况下编写它。但是,如果您执行任何需要阻止的操作,则应阅读有关using DELIMITER的信息。

然后添加一些评论:

insert into comments set comment_id = 1, comment_text = 'comment 1', post_id = 1; insert into comments set comment_id = 2, comment_text = 'comment 2', post_id = 1; insert into comments set comment_id = 3, comment_text = 'comment 3', post_id = 1;

确认已增加评论数:

select * from posts;
+---------+--------------+------------------+
| post_id | post_subject | numberOfComments |
+---------+--------------+------------------+
|       1 | subject      |                3 |
+---------+--------------+------------------+

1
投票
SELECT p.post_id, p.post_subject, COALESCE(c.ccount) numberOfComments FROM posts p LEFT JOIN ( SELECT post_id, COUNT(*) ccount FROM comments GROUP BY post_id ) c ON p.post_id = c.post_id;

SQL用于这种查询;它具有惊人的良好性能,尤其是在使用主键时。如果您想了解为什么性能更好,可以阅读

松散索引扫描。

您可以在数据库中创建一个视图,其结果与您建议的表相同,如下所示

CREATE VIEW post_with_comment_count AS SELECT p.post_id, p.post_subject, COALESCE(c.ccount) numberOfComments FROM posts p LEFT JOIN ( SELECT post_id, COUNT(*) ccount FROM comments GROUP BY post_id ) c ON p.post_id = c.post_id;

为什么这是解决问题的好方法?与触发器相比,它更易于阅读和维护,不易出错,并且比[[procedural。

declarative
如果到达该方法的性能差的地步,则可以采用其他方法来做。但是,只有拥有数百万条帖子和评论,您才能到达那里。在此之前,请保持简单。 

0
投票
以上是如何实现触发器的要点
© www.soinside.com 2019 - 2024. All rights reserved.