我想知道如何更新列[[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));
我创建了您在问题中显示的表格,然后在帖子中添加了一行:
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 |
+---------+--------------+------------------+
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。如果到达该方法的性能差的地步,则可以采用其他方法来做。但是,只有拥有数百万条帖子和评论,您才能到达那里。在此之前,请保持简单。