在 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中文网其他相关文章!