我的数据库中有两个表City和Buildings。它们与<
链接,即城市表中的city_number
和建筑物表中的Primary Key
。如果用户要从“城市”表中删除记录,我想从“建筑物”表中删除与该城市相关的所有记录。我使用通过参数传递的唯一自动递增ID来删除这些记录。我的SQL查询看起来像这样:
Foreign Key
上面的查询将无法正常工作SQL仅允许使用DELETE C.*, B.*
FROM City AS C
INNER JOIN Buildings AS B
ON C.c_number = B.b_district
WHERE D.c_id = 'some id example: 107';
删除一个表中的记录,因此我将不得不使用两个单独的INNER JOIN
语句,如下所示:
DELETE
我的问题是,删除在两个表中绑定的记录的最佳实践是什么?由于必须使用两个单独的SQL语句,我应该传递City,然后从Buildings表中删除记录吗?还是我应该创建另一个查询,以基于唯一ID从“城市”表中提取“城市”,然后从“建筑物”中删除记录?如果有人知道更好的方法,请告诉我。
答案 0 :(得分:3)
我相信实现目标的最简单方法是使用ON DELETE CASCADE设置外键。这样,每当删除父表中的一行时,子表中的所有相关行都将被自动删除。
以下是更改表以使用ON DELETE CASCADE创建外键的方法的示例:
ALTER TABLE child_table
ADD CONSTRAINT fk_name
FOREIGN KEY (child_col1, child_col2, ... child_col_n)
REFERENCES parent_table (parent_col1, parent_col2, ... parent_col_n)
ON DELETE CASCADE;
在您的情况下,子表为Buildings,父表为City。听起来您只有该列的city_number。您必须填写外键的名称。
答案 1 :(得分:1)
就像提到的Shannon一样,您可以使用ON DELETE CASCADE从父表和子表中删除数据。
这是一个有效的示例: http://sqlfiddle.com/#!18/f5860/10
答案 2 :(得分:0)
在不编写代码的情况下,我会这样做:
可重复使用,独立且清晰。
这违反了SRP,但是,如果您对此感到担心,请告诉我,我将发布基于SRP的SQL解决方案。