首页 > 数据库 > mysql教程 > 如何在没有主键的情况下删除 PostgreSQL 中特定数量的有序行?

如何在没有主键的情况下删除 PostgreSQL 中特定数量的有序行?

Mary-Kate Olsen
发布: 2025-01-05 07:42:42
原创
381 人浏览过

How to Delete a Specific Number of Ordered Rows in PostgreSQL Without a Primary Key?

在 PostgreSQL 中保留行删除计数而不进行排序和主键

在 PostgreSQL 中,无法将排序或限制与删除语法结合起来当尝试删除特定数量的行同时保留它们的选择顺序时,这是一个挑战。由于表中缺少主键,情况变得更加复杂。

解决方案:利用 ctid

为了规避这些限制,我们可以利用 ctid(当前行的元组标识符):

DELETE FROM ONLY logtable
WHERE ctid IN (
    SELECT ctid
    FROM logtable
    ORDER BY timestamp
    LIMIT 10
);
登录后复制

ctid 为每行提供唯一标识符其表中的版本。通过选择按时间戳排序的前 10 行的 ctid 并在 DELETE 语句中使用它们,我们可以有效地删除所需数量的行,即使所有时间戳值都相同。

考虑分区表

如果日志表已分区,我们需要考虑多个分区包含具有相同时间戳的行的可能性。为了防止删除太多行,我们可以在查询中包含 tableoid(表标识符):

DELETE FROM logtable
WHERE (tableoid,ctid) IN (
    SELECT tableoid,ctid
    FROM logtable
    ORDER BY timestamp
    LIMIT 10
);
登录后复制

这可确保删除仅限于每个分区内指定的行数。

通过利用 ctid 和 tableoid,即使没有主键,我们也可以在 PostgreSQL 中实现删除固定数量的排序行的功能。

以上是如何在没有主键的情况下删除 PostgreSQL 中特定数量的有序行?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板