MySQL多对多架构设置

时间:2011-04-29 17:08:24

标签: mysql foreign-keys many-to-many

我正在设置一个带有帖子和标签的mysql数据库,如下所示:

posts    
+-------------+--------------+------+-----+-------------------+----------------+
| Field       | Type         | Null | Key | Default           | Extra          |
+-------------+--------------+------+-----+-------------------+----------------+
| id          | int(11)      | NO   | PRI | NULL              | auto_increment |
[...]

tags
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| tag   | varchar(255) | NO   | UNI | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

post_tag_map
+------------+---------+------+-----+---------+-------+
| Field      | Type    | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+-------+
| post_id    | int(11) | NO   | PRI | NULL    |       |
| tag_id     | int(11) | NO   | PRI | NULL    |       |
+------------+---------+------+-----+---------+-------+

标签将在多个帖子之间共享; 5号和10号后可以使用“红色”。

我的问题是:如果标签被多个帖子使用,如何删除标签,如果标签不被删除,该如何删除?

注意:我正在使用外键我认为会处理这个问题,但它似乎没有起作用:

CREATE TABLE `post_tag_map` (
  `post_id` int(11) NOT NULL,
  `tag_id` int(11) NOT NULL,
  PRIMARY KEY (`post_id`,`tag_id`),
  FOREIGN KEY (`post_id`) REFERENCES posts(`id`),
  FOREIGN KEY (`tag_id`) REFERENCES tag(`id`)
)  

3 个答案:

答案 0 :(得分:3)

你想要声明这样的外键:

FOREIGN KEY (post_id) REFERENCES posts(id)
   ON DELETE CASCADE,
FOREIGN KEY (tag_id) REFERENCES tag(id)
   ON DELETE CASCADE

'on delete cascade'是启动自动删除的内容。请注意,级联不会在链接表的另一侧“向上”传播。如果删除标记,则只有post_tag_map中的匹配记录会消失,但只保留附加的帖子。

答案 1 :(得分:3)

您可以使用delete语句一次性删除所有表格。

DELETE FROM post_tag_map, posts, tags
WHERE post.id = post_tag_map.post_id
AND tags.id = post_tag_map.tag_id
AND tags.id = 256;

但是,MySQL不保证删除的顺序。如果你有外键,那么可能会阻止删除。

因此要么不要使用FOREIGN KEY **or** declare them with a ON DELETE CASCADE`子句。

请记住,MyISAM不支持外键,因此您只能进行多项删除。

有关此处多项删除的详情:http://dev.mysql.com/doc/refman/5.1/en/delete.html

答案 2 :(得分:0)