有条件地删除 MySQL 数据库中的行

Conditionally deleting rows in MySQL Database

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

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

现在我想扩展此语句,以便它仅在实际存在带有 timestamp >= ? 的新行时才删除旧行。是否可以在SQL中进行这样的条件删除?

你可以这样做:

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

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

You can't specify target table 'myTable' for update in FROM clause