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

仅当不再引用其他表时才删除条目

  •  1
  • eldios1981  · 技术社区  · 7 年前

    我有三张桌子:

    起源: 表A:

    id tab_b tab_c
    1  b1    c1
    2  b1    c2
    

    两个子表: 表B:

    id name
    b1 ABC
    FOREIN KEY (id) REFERENCES table A (tab_b) ON DELETTE CASCADE
    

    表C:

    id name
    c1 DEF
    c2 GHI
    FOREIN KEY (id) REFERENCES table A (tab_c) ON DELETTE CASCADE
    

    如果要删除表C中的c2,则只应删除表C中的条目c2和表A中的条目2。只有当没有更多的与之相关的条目时,才应删除b1。实际上,表B中的条目也将被删除。(我也用了restrict,但不会删除任何内容)。是否有可能在删除/更新和级联/限制时执行此操作?

    还是用PHP编程?

    我希望它清楚我想要什么。

    提前谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   DataVader    7 年前

    使用fks时,可以使用“cascade”、“restrict”或“set null”定义“on delete”。当删除一个条目(在其他条目中是FK)时,“层叠”将删除它们,“设置空值”将FK设置为“空值”,“限制”将停止整个过程。

    据我所知,你想要的恰恰相反。如果您有三个表“A”、“B”和“C”,其中“A”包含“N-N”引用,那么您就必须非常棘手。比如:

    DELETE IGNORE  B, C
    FROM    B
    INNER JOIN  A
        ON      A.tab_b = B.id
    INNER JOIN  C
        ON      A.tab_c = C.id
    WHERE       c.id = ?;
    

    如果不起作用,在“A”中设置“on delete cascade”,手动删除“C”中的项目,并使用“after delete触发器”来处理“B”。