【问题标题】:Conditionally deleting rows in MySQL Database有条件地删除 MySQL 数据库中的行
【发布时间】:2020-08-04 04:40:54
【问题描述】:

我有一个通过插入新数据定期更新的数据库。在此更新之后,timestamp 比当前 timestamp 旧的每一行都将被删除。像这样:

DELETE FROM myTable WHERE timestamp < ? 其中? 是当前的timestamp

现在我想扩展这个语句,以便它只删除旧行,如果实际上有带有timestamp >= ? 的新行。是否可以在 SQL 中进行这样的条件删除?

【问题讨论】:

    标签: mysql sql conditional-statements sql-delete


    【解决方案1】:

    你可以这样做:

    DELETE FROM myTable
    WHERE timestamp < ?
    AND EXISTS (
      SELECT *
      FROM (
        SELECT 1
        FROM myTable
        WHERE timestamp >= ? 
      ) t
    )
    

    额外的嵌套 (SELECT * FROM (...) t) 是必需的,因为在 MySQL 中(至少到 8.0.19),否则,你会得到一个错误:

    您不能在 FROM 子句中指定目标表 'myTable' 进行更新

    【讨论】:

    • 谢谢,我试试这个。语句末尾的单个t 有什么作用?
    • @herhuf:在 MySQL 中,所有派生表(FROM 子句中的子查询)都需要一个名称。它什么也不做,也不是这里真正需要的,但它是 MySQL(和其他 SQL 方言)的基本语法要求。尝试删除它,您会看到错误消息。
    猜你喜欢
    • 2022-08-12
    • 2013-01-10
    • 2012-10-17
    • 2016-12-02
    • 2015-05-16
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2015-08-31
    相关资源
    最近更新 更多