mysql查询在外键关系时用单个查询删除多个表

时间:2014-03-04 16:24:28

标签: mysql sql sql-server delete-row cascading-deletes

我创建了博客系统。在这篇博客中,我创建了三个表。

表1:文章

+----------------+-----------+-------+-------------+
| article_id(PK) | name      | description         |
+----------------+-----------+-------+-------------+
| 1              | article-1 | lorem ipsum       |
| 2              | article-2 | lorem ipsum       |
+----------------+-----------+-------+-------------+

表2:article_hook

+---------------------------+---------+-----------+
| article_hook_id(PK, auto) | hook_id | hook_type |
+---------------------------+---------+-----------+
| 1                         | 1       | article   |
| 2                         | 1       | tag       |
+---------------------------+---------+-----------+

这里我创建了外键关系。我想删除文章创建删除查询

DELETE FROM article WHERE article_id = 1 LIMIT 1

已成功删除记录。但它删除了article_hook表中hook_id = 1的所有记录。但是当我传递Hook_id = 1和hook_type ='article'时,我只需要从article_hook表中删除一条记录。

2 个答案:

答案 0 :(得分:0)

您可能已指定on delete cascade。所以这种行为。在两个提到的表之间确实有foreign key relationship

根据MySQL Foreign Key Constraints reference

  

CASCADE:从父表中删除或更新行,然后   自动删除或更新子表中的匹配行。   支持ON DELETE CASCADE和ON UPDATE CASCADE。

根据MySQL文档http://dev.mysql.com/doc/refman/5.5/en/example-foreign-keys.html

  

对于InnoDB以外的存储引擎,可以在定义时使用   列使用REFERENCES tbl_name(col_name)子句,该子句没有   实际效果,并仅作为备忘录或评论给你   您当前定义的列旨在引用a   另一张表中的列。

因为这两个表都与FK关系持续存在;从父项中删除行也将删除子/引用表中的匹配行。

根据您的评论:

可以像下面那样创建复合外键,但为了获得更好的性能,请尝试分解表格。

FOREIGN KEY (hook_id, hook_type) 
    REFERENCES article(article_id)

答案 1 :(得分:0)

如果你不能像我在评论中提到的那样分开桌子,你可以通过删除触发器来实现。

CREATE TRIGGER delete_hooks AFTER DELETE on article
DELETE from article_hook 
    WHERE article_hook.hook_id = old.id 
        AND hook_type = 'article'
相关问题