有条件地删除 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
我有一个通过插入新数据定期更新的数据库。更新后,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