sql - 如何在 PostgreSQL 中通过排序删除固定数量的行?

标签 sql postgresql

我正在尝试将一些旧的 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's ctid will change if it is updated or moved by VACUUM FULL. Therefore ctid is useless as a long-term row identifier.

还有 oid,但仅当您在创建表时特别要求时才存在。

关于sql - 如何在 PostgreSQL 中通过排序删除固定数量的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5170546/

相关文章:

SQL 'belong to'逻辑

postgresql - PostgreSQL使Go建立的连接保持开放

c# - Linq 数组列表顺序更改

ruby-on-rails - Dockerized 应用程序适用于带有 PSQL 的 Rails,但数据库容器不工作

postgresql - 从 postgres 中的另一个表列值更新列值

postgresql - 如何让 postgresql 文本搜索在排名中使用搜索词顺序

python - 模块未找到错误 : No module named 'psycopg2' in ipython

php - 我需要从我的网站上的表单中保存电子邮件,但出于某种原因我无法保存它

Mysql 月份数字到月份名称的转换

mysql - 巨大的SQL语句优化