Автоматическое обновление поля MySql - PullRequest
0 голосов
/ 03 января 2012

У меня есть 2 таблицы MySQL, и я хочу, чтобы:

1) когда я удаляю статью, связанные теги будут автоматически удалены

2) при добавлении / удалении тега поле «hasTags» из статей, подлежащих автоматическому обновлению (0 - для 0 тегов, 1 - для тегов 1+).

Для 1 - я использовал внешний ключ, и он работает

ALTER TABLE `articles`
  ADD CONSTRAINT `articles_ibfk_1` FOREIGN KEY (`id`) REFERENCES `tags` (`id`) ON DELETE CASCADE;

Я не знаю, как сделать для второй части. Это возможно?

Таблицы

articles == id | title | content | hasTags

tags == id | articleId | tagname

Спасибо!

Ответы [ 2 ]

4 голосов
/ 03 января 2012

Для части 2 вы можете сделать это в коде приложения, в той части, где вы также добавляете / удаляете тег.

Обновите, я бы предложил сделать hastags счетчиком ссылок, чтобы избежать упомянутой проблемы @James.

Или вы можете создать 3 триггера:

DELIMITER $$

CREATE TRIGGER ai_tags_each AFTER INSERT ON tags FOR EACH ROW
BEGIN
  UPDATE articles SET hasTags = COALESCE(hastags,0) + 1 WHERE id = NEW.article_id;
END $$

CREATE TRIGGER ad_tags_each AFTER DELETE ON tags FOR EACH ROW
BEGIN
  UPDATE articles SET hasTags = hasTags - 1 WHERE id = OLD.article_id;
END $$

CREATE TRIGGER au_tags_each AFTER UPDATE ON tags FOR EACH ROW
BEGIN
  UPDATE articles SET hasTags = hasTags - 1 WHERE id = OLD.article_id;
  UPDATE articles SET hasTags = COALESCE(hastags,0) + 1 WHERE id = NEW.article_id;
END $$

DELIMITER ;
1 голос
/ 03 января 2012

Для части 1 вы определили FOREIGN KEY в обратном порядке.Вам нужно:

ALTER TABLE tags
  ADD CONSTRAINT articles_tags_FK
        FOREIGN KEY (articleId) 
          REFERENCES articles (id) 
        ON DELETE CASCADE;

Для части 2 вам действительно нужен столбец hasTags?

Вы можете оставить его и использовать:

SELECT a.id
     , a.title
     , a.content
     , EXISTS (SELECT * FROM tags WHERE articleId = a.id)
       AS hasTags
FROM articles AS a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...