我已经创建了博客系统。在这个博客中,我创建了三个表。
表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_hook’时,我只需要从article_hook表中删除一条记录。
发布于 2014-03-04 16:52:33
如果您不能像我在评论中提到的那样将表分开,您可以使用delete触发器来代替。
CREATE TRIGGER delete_hooks AFTER DELETE on article
DELETE from article_hook
WHERE article_hook.hook_id = old.id
AND hook_type = 'article'发布于 2014-03-04 16:45:53
您可能已经指定了on delete cascade。所以这种行为。在提到的两个表之间确实有一个foreign key relationship。
根据MySQL外键约束引用
级联:从父表中删除或更新行,并自动删除或更新子表中匹配的行。支持删除级联和更新级联。
根据这里的MySQL文档,http://dev.mysql.com/doc/refman/5.5/en/example-foreign-keys.html
对于InnoDB以外的存储引擎,在定义列时可以使用引用tbl_name(col_name)子句,该子句没有实际效果,只是作为备注或注释,说明您当前定义的列是要引用另一个表中的列。
因此,由于这两个表都具有FK关系;从父表中删除一行也将从子表/引用表中删除匹配行。
基于您的评论:
可以像下面这样创建复合外键,但是为了更好的性能,尝试分解表。
FOREIGN KEY (hook_id, hook_type)
REFERENCES article(article_id)https://stackoverflow.com/questions/22177408
复制相似问题