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

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

Patricia Arquette
发布: 2024-12-30 07:43:11
原创
450 人浏览过

How Can I Delete Rows in PostgreSQL in a Specific Order Without a Primary Key?

在没有主键的情况下保留 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中文网其他相关文章!

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