如何从与FK链接的两个不同表中删除记录?的SQL

时间:2018-08-06 21:38:44

标签: sql sql-server-2008 inner-join sql-delete

我的数据库中有两个表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从“城市”表中提取“城市”,然后从“建筑物”中删除记录?如果有人知道更好的方法,请告诉我。

3 个答案:

答案 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)

在不编写代码的情况下,我会这样做:

  1. 选择属于一个城市的建筑物要删除的所有ID
  2. 删除所有建筑物
  3. 删除城市
  4. 将其放入存储过程

可重复使用,独立且清晰。

这违反了SRP,但是,如果您对此感到担心,请告诉我,我将发布基于SRP的SQL解决方案。