如何正确处理RDBMS中的更新/删除操作?

时间:2013-12-31 00:49:08

标签: mysql sql database-design cascade

我最近在MySQL中设计了我的第一个关系数据库,使用InnoDB作为我所有表的引擎。我想知道当你有多对一的关系时如何正确处理DELETEUPDATE操作。

示例

假设您有以下表格:

T1
PK t1_ID
FK t2_ID

T2
PK t2_ID
FK t3_ID
FK t4_ID

T3
PK t3_ID

T4
PK t4_ID
ç

使用这些表,为t1中的FK和t2中的两个FK指定了删除操作的级联。如果从t3t4删除了一个或多个记录,则t2t1中的相应记录也会被删除。

问题

我需要的删除功能是相反的。我希望发生以下情况:

  1. 删除t1
  2. 中的记录
  3. 删除t2
  4. 中的相应记录
  5. 如果t3中的相应记录未在其他地方使用,即t3_ID不在t2中的任何其他位置,请删除t3
  6. t4
  7. 重复步骤3

    我还需要类似的更新操作功能。

    1. 如果t3 / t4中的记录在t2中没有其他条目,则 价值可以简单地改变。
    2. 如果t3 / t4中的记录在t2中至少有一个其他记录, 需要在t3 / t4和参考中创建新记录 t2需要更新。
    3. 我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:3)

要传播删除,您可以执行以下操作:

CREATE TRIGGER delete_unused_t2 AFTER DELETE on t1
FOR EACH ROW
BEGIN
    IF old.t2_ID NOT IN (SELECT t2_ID FROM t1)
    THEN BEGIN
        DELETE FROM t2
        WHERE t2.t2_ID = old.t2_ID;
    END;
    END IF;
END

如果你想定期而不是在触发器中做,你可以这样做:

DELETE FROM t2
LEFT JOIN t1 USING (t2_ID)
WHERE t1_ID IS NULL