代码之家  ›  专栏  ›  技术社区  ›  espresso_coffee

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

  •  0
  • espresso_coffee  · 技术社区  · 6 年前

    我的数据库里有两张表城市和建筑物。它们与 city_number 那就是 Primary Key 城市餐桌和 Foreign Key 在建筑物的桌子上。如果用户想从城市表中删除记录,我想从与该城市相关的建筑物表中删除任何记录。我使用通过参数传递的唯一自动递增id来删除这些记录。我的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'; 
    

    上面的查询不起作用,因为SQL只允许删除一个表中的记录 INNER JOIN 所以我得用两个分开的 DELETE 这样的陈述:

    DELETE
    FROM City 
    WHERE c_id = '107'
    
    DELETE 
    FROM Buildings 
    WHERE b_city = 'city that is tied to unique id 107' 
    

    我的问题是,删除绑定在两个表中的记录的最佳做法是什么?因为我必须使用两个单独的SQL语句,所以我应该传递City然后从Buildings表中删除记录吗?或者,我是否应该创建另一个查询,该查询将基于唯一id从City表中提取City,然后从建筑物中删除记录?如果有人知道更好的方法,请让我知道。

    3 回复  |  直到 6 年前
        1
  •  3
  •   Shannon Fallon    6 年前

    我相信实现你的目标最简单的方法就是用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;
    

    在您的情况下,子表是建筑物,父表是城市。听起来你应该只有城市号。你得填上你外键的名字。

        2
  •  1
  •   Saravana Kannadasan    6 年前

    就像 Shannon 前面提到过,可以使用ON DELETE CASCADE从父表和子表中删除数据。

    下面是一个工作示例: http://sqlfiddle.com/#!18/f5860/10

        3
  •  0
  •   RandomUs1r    6 年前

    如果不写代码,我会这样做:

    1. 为属于某个城市的建筑物选择要删除的所有ID
    2. 删除所有建筑物
    3. 删除城市
    4. 把它放到一个存储过程中

    可重用、独立、清晰。

    这是对SRP的一种违反,但是,如果您关心这个问题,请告诉我,我将发布一个基于SRP的SQL解决方案。