【问题标题】:SELECT and DELETE选择和删除
【发布时间】:2011-04-06 02:35:08
【问题描述】:

我需要从表中删除某些行。必须删除哪些行是我通过查询发现的。但是,it appears that you cannot do both operations (select and delete) in the same query

目前,您无法从 表并从同一个表中选择 在子查询中。

所以我不能这样做:

DELETE
FROM telefono
WHERE telefono_id IN (
    SELECT te.telefono_id
    FROM telefono te
    LEFT JOIN centro_telefono ce ON te.telefono_id=ce.telefono_id AND ce.telefono_id IS NOT NULL
    LEFT JOIN contacto_telefono co ON te.telefono_id=co.telefono_id AND co.telefono_id IS NOT NULL
    WHERE COALESCE(ce.telefono_id, co.telefono_id) IS NULL AND te.fecha_alta < DATE_SUB(NOW(), INTERVAL 1 DAY)
);
-- SQL Error (1093): You can't specify target table for update in FROM clause

如何在纯 MySQL 中实现这种记录清理?

服务器运行 MySQL 5.1.39。

【问题讨论】:

  • 为什么它必须在“纯” MySQL 中?
  • @NullUserException:我不想增加额外的复杂性(编写 PHP 脚本,通过 cron 配置它,测试它是否运行成功......)。此外,SQL 代码可以直接从 MySQL 事件或存储的例程中触发。

标签: mysql sql innodb mysql-error-1093


【解决方案1】:

尝试使用连接执行删除语句

DELETE te
FROM telefono as te
    LEFT JOIN centro_telefono ce
        ON te.telefono_id=ce.telefono_id AND ce.telefono_id IS NOT NULL
    LEFT JOIN contacto_telefono co
        ON te.telefono_id=co.telefono_id AND co.telefono_id IS NOT NULL
WHERE
    COALESCE(ce.telefono_id, co.telefono_id) IS NULL
    AND te.fecha_alta < DATE_SUB(NOW(), INTERVAL 1 DAY)

【讨论】:

  • 非常好,谢谢。这是我的第一次尝试,但我无法掌握正确的语法。
【解决方案2】:
 CREATE TEMPORARY TABLE tmptable
 SELECT te.telefono_id
 FROM telefono te
  LEFT JOIN centro_telefono ce ON te.telefono_id=ce.telefono_id AND ce.telefono_id IS NOT NULL
  LEFT JOIN contacto_telefono co ON te.telefono_id=co.telefono_id AND co.telefono_id IS NOT NULL
  WHERE COALESCE(ce.telefono_id, co.telefono_id) IS NULL AND te.fecha_alta < DATE_SUB(NOW(), INTERVAL 1 DAY)

 DELETE FROM telefono te
 WHERE te.telefono_id IN (Select telefono_id from tmptable)

【讨论】:

    【解决方案3】:

    使用UPDATE 标记要删除的行,然后使用DELETE 实际删除它们。

    UPDATE telefono SET marker_column='DELETE ME!!!!' WHERE telefono_id IN (...);
    DELETE FROM telefono WHERE marker_column='DELETE ME!!!!';
    

    【讨论】:

      猜你喜欢
      • 2012-09-28
      • 2014-02-28
      • 2023-03-23
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多