【问题标题】:Delete from table that is used in the where clause从 where 子句中使用的表中删除
【发布时间】:2010-05-10 20:05:01
【问题描述】:

我正在编写一个小脚本来同步 2 个 MySQL 表(t1 被“镜像”到 t2)

在一个步骤中,我想删除 t2 中已在 t1 中删除的具有相同 ID 的行。

我试过这个查询:

delete from t2 where t2.id in 
    ( select t2.id left join t1 on (t1.id=t2.id) where t1.id is null )

但是 Mysql 禁止我在删除和选择中同时使用 t2(顺便说一句听起来合乎逻辑)

当然,我可以将查询拆分为 2 个查询:首先选择 ID,然后删除具有这些 ID 的行。

我的问题:您是否有更简洁的方法从 t2 中删除 t1 中不再存在的行?只有一个查询?

【问题讨论】:

    标签: mysql sql-delete synchronize


    【解决方案1】:

    此查询将两个表连接起来,只选择新表中没有伙伴的那些,从而允许您一次性删除它们:

    DELETE t2 FROM t2
    LEFT JOIN t1
    ON t2.id = t1.id
    WHERE t1.id IS NULL;
    

    【讨论】:

      【解决方案2】:
      delete t2.* 
      from t2 
      left join t1 on (t1.id=t2.id) 
      where t1.id is null;
      

      【讨论】:

        【解决方案3】:

        如果您对 t2 使用 t1 的左连接,对于任何在 t2 中没有匹配项的行,t1 字段的值都将为 NULL,因此应该可以:

        DELETE FROM t2
        LEFT JOIN t1 ON t1.id = t2.id
        WHERE t1.id IS NULL;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-08
          • 1970-01-01
          • 1970-01-01
          • 2018-04-21
          • 1970-01-01
          相关资源
          最近更新 更多