Как сделать триггер в MYSQL, который действует как счетчик, когда я вставляю новый комментарий в свое сообщение - PullRequest
2 голосов
/ 14 марта 2020

Я хотел бы знать, как обновить столбец numberOfComments , чтобы отобразить количество комментариев, сделанных к сообщению. Можно ли создать триггер для таблицы комментариев и обновить столбец 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));

Ответы [ 3 ]

1 голос
/ 14 марта 2020

Как правило, лучше, чтобы ваши запросы генерировали такие числа, а не запускали триггер. Вы можете сделать это с помощью чего-то подобного:

  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;

Почему это хороший способ решить вашу проблему? Его легче читать и поддерживать, чем триггер, он менее подвержен сбоям и декларативный , а не процедурный.

Если вы доберетесь до Точка, где производительность этого подхода плохая, вы можете делать по-другому. Но вы не попадете туда, пока у вас не будет много миллионов постов и комментариев. До тех пор, будь проще.

0 голосов
/ 15 марта 2020

вы можете использовать mysql триггеры, в отличие от запроса выбора или соединения, они будут сохраняться в вашей базе данных до тех пор, пока они не будут отброшены.

DROP TRIGGER IF EXISTS `comment_count_incrementer`;

DELIMITER $$

CREATE TRIGGER `comment_count_incrementer`AFTER INSERT ON comments 
  FOR EACH ROW 
    BEGIN
      UPDATE posts 
      SET numberofComments = CASE numberOfComments
                               WHEN IS NULL THEN 1
                               ELSE numberofComments + 1
                             END
      WHERE posts.post_id = comments.post_id;
    END$$

DELIMITER ;

выше представляет собой суть того, как реализованы триггеры

0 голосов
/ 15 марта 2020

Я согласен с другими ответами и комментариями, что сложно использовать триггеры, чтобы количество комментариев обновлялось идеально. Вы могли бы подумать, что это будет надежно, но на практике это не так.

Но чтобы ответить на ваш вопрос, вот демо:

Я создал таблицы, как вы показываете в своем вопросе, а затем добавьте строку в сообщения:

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. Но если вы делаете что-то, что требует блока, то вы должны прочитать о , используя 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 |
+---------+--------------+------------------+
...