我创建了博客系统。在这篇博客中,我创建了三个表。
表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表中删除一条记录。
答案 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'