无法使用NOT EXISTS MySQL语法从同一表中删除记录

时间:2019-12-18 10:42:15

标签: mysql sql database

我要在同一张表中执行删除操作。我尝试了不同的方法,但仍然无法正确完成。因此,我收到此错误您无法在FROM子句中指定要更新的目标表'tb'。我尝试对表进行别名处理,但未完成任何操作。我不知道丢失了什么。我感谢任何想法。

indicatorColor: Colors.blueAccent

2 个答案:

答案 0 :(得分:1)

为避免在操作同一张表时出现更新错误,您可以尝试使用嵌套的子查询来构建临时表

 DELETE  FROM tb 
 WHERE NOT EXISTS ( 
    SELECT * 
    FROM (
      SELECT * 
      from tb
      WHERE `merchantId` = 'A32WNPGI8GE4WW' 
      AND `marketplaceId`  IN ('A1AM78C64UM0Y8', 'A2EUQ1WTGCTBG2', 'ATVPDKIKX0DER')
    ) t
  ); 

答案 1 :(得分:0)

MySQL在JOINDELETE中支持UPDATE。这可以解决此数据库中“相同表”的限制。按照您的逻辑,它看起来像:

DELETE tb
    FROM tb LEFT JOIN
         tb tb2
         ON tb2.`merchantId` = 'A32WNPGI8GE4WW' AND
            tb2.`marketplaceId` IN ('A1AM78C64UM0Y8', 'A2EUQ1WTGCTBG2', 'ATVPDKIKX0DER')
    WHERE tb2.merchantID IS NULL;

但是,此查询非常不规则。它要么删除所有行,要么不删除任何行。

如果您只想保留这些行,那么这就是方法:

DELETE tb FROM tb
    WHERE NOT (tb.`merchantId` = 'A32WNPGI8GE4WW' AND
               tb.`marketplaceId` IN ('A1AM78C64UM0Y8', 'A2EUQ1WTGCTBG2', 'ATVPDKIKX0DER')
              );

或者:

DELETE tb FROM tb
    WHERE tb.merchantId <> 'A32WNPGI8GE4WW' OR
          tb.marketplaceId NOT IN ('A1AM78C64UM0Y8', 'A2EUQ1WTGCTBG2', 'ATVPDKIKX0DER');

如果任一列中有NULL个值,则逻辑也需要考虑到这一点。