在没有主键的情况下保留 PostgreSQL 中的行删除顺序
在 MySQL 中,查询 DELETE FROM logtable ORDER BY timestamp LIMIT 10;毫不费力地从表中删除指定数量的行,同时保持排序顺序。然而,PostgreSQL 通过在其删除语法中禁止排序或限制来提出挑战,特别是当表缺少主键时。
克服主键约束
规避针对这个障碍,PostgreSQL 提供了一个利用 ctid 的解决方案。 ctid 表示表中每行的物理位置。虽然它不是永久标识符,但它在每个表中的唯一性使其成为行删除的可行替代方案。
利用 ctid
可以利用 ctid 来删除预定的行使用以下查询的排序行数:
DELETE FROM ONLY logtable WHERE ctid IN ( SELECT ctid FROM logtable ORDER BY timestamp LIMIT 10 );
DELETE FROM ONLY 限制删除操作到指定的表,防止意外删除继承的表。
处理分区和安全设置
如果日志表已分区,则必须包含 tableoid(表 ID)在查询中防止多个分区发生删除。
此外,如果实施了安全策略,您可以需要调整查询以确保适当的访问权限。
附加说明
重要的是要记住,当通过 VACUUM FULL 更新或移动行时,ctid 可能会更改。如果您打算使用 ctid 作为长期行标识符,请记住此限制。
以上是如何在没有主键的情况下按特定顺序删除 PostgreSQL 中的行?的详细内容。更多信息请关注PHP中文网其他相关文章!