我正在尝试将一些旧的 MySQL 查询移植到 PostgreSQL,但我遇到了这个问题:
DELETE FROM logtable ORDER BY timestamp LIMIT 10;
PostgreSQL 在其删除语法中不允许排序或限制,而且该表没有主键,所以我不能使用子查询。此外,我想保留查询完全删除给定数字或记录的行为——例如,如果表包含 30 行但它们都具有相同的时间戳,我仍然想删除 10 , 尽管哪 10 个并不重要。
所以;如何在 PostgreSQL 中通过排序删除固定数量的行?
编辑:没有主键意味着没有 log_id
列或类似列。啊,遗留系统的乐趣!
最佳答案
您可以尝试使用 ctid
:
DELETE FROM logtable
WHERE ctid IN (
SELECT ctid
FROM logtable
ORDER BY timestamp
LIMIT 10
)
ctid
是:
The physical location of the row version within its table. Note that although the
ctid
can be used to locate the row version very quickly, a row'sctid
will change if it is updated or moved byVACUUM FULL
. Thereforectid
is useless as a long-term row identifier.
还有 oid
,但仅当您在创建表时特别要求时才存在。
关于sql - 如何在 PostgreSQL 中通过排序删除固定数量的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5170546/