我正在设置一个带有帖子和标签的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`)
)
答案 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)
您可能需要添加到FOREIGN KEY声明:
http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html