【问题标题】:SQL DELETE from multiple tables从多个表中删除 SQL
【发布时间】:2012-01-19 07:38:00
【问题描述】:

当我尝试执行这个删除查询时,SQL 给了我这个错误:

“无法删除或更新父行:外键约束失败(carpooling.pedido, CONSTRAINT pedido_ibfk_1 FOREIGN KEY (ID_ROTA) REFERENCES rota (ID_ROTA))”

查询:

DELETE rota,rota_alerta,pedido FROM rota
    LEFT OUTER JOIN pedido ON rota.ID_ROTA=pedido.ID_ROTA
    LEFT OUTER JOIN rota_alerta ON rota.ID_ROTA=rota_alerta.ID_ROTA
    WHERE rota.ID_UTILIZADOR=26;

我正在尝试从“pedido”和“rota_alerta”中删除所有通过“ID_ROTA”链接到“rota”表行的行。此“ID_ROTA”取决于表“rota”上具有相同“ID_UTILIZADOR”(在本例中为 26)的行数。

另外,我想删除所有具有指定“ID_UTILIZADOR”的“rota”行。

我该如何解决这个问题?

编辑

我忘了说我不想使用“级联约束”,因为在某些情况下我应该执行“删除 ID_UTILIZADOR=26 的 rota”(如评论中所述)并避免删除子行如果它们存在。

【问题讨论】:

    标签: mysql sql left-join join


    【解决方案1】:

    看看cascade constraints 子句

    【讨论】:

      【解决方案2】:

      我会先删除我的孩子收藏:

      delete rota_alerta where rota_id in(select id_rota from rota where ID_UTILIZADOR=26)
      delete pedido where rota_id in(select rota_id from rota where ID_UTILIZADOR=26)
      delete rota where ID_UTILIZADOR=26
      

      【讨论】:

      • @CristianoSantos 这实质上是手动编码级联删除,会给您带来与您的评论中描述的相同的问题
      • @Pleun 但是在另一个我不应该删除子行的查询中,我只需要执行类似“delete rota where ID_UTILIZADOR=26”的内容
      • 是的,你说得有道理。在某些情况下会导致您的删除(在另一个查询中)失败,但如果这是您想要的,这个解决方案就可以了。
      【解决方案3】:

      将您的外键约束更改为CASCADE

      好吧,从您现在给出的评论中可以清楚地看出,级联删除是有条件的。

      这意味着您要么需要编码出确切的条件。在您的客户端或存储过程中。

      或者还是改成级联,再次添加触发器以防止删除(不确定MySql中是否可行)

      【讨论】:

      • 由于安全风险,我做不到=S.
      • 在某些情况下,如果子行存在并且此查询不应通过,我不想授予从“rota”中删除行的权限。
      • 你不能一边吃蛋糕一边吃。顺便说一句,这在您的问题中非常重要。您应该更新问题。此外,我不会认为这是一种安全风险,而是一种功能限制。
      • 由于您的回答对其他人有帮助,我也会投票赞成 =)
      猜你喜欢
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      • 2014-03-03
      • 2014-07-28
      • 2013-11-08
      相关资源
      最近更新 更多