跳转到主要内容

pg_lexo

用于列表插入与重排的字典序位置类型

概览

扩展包名版本分类许可证语言
pg_lexo0.6.0TYPEMITRust
ID扩展名BinLibLoadCreateTrustReloc模式
3530pg_lexo否是否是否否-

Release/package 0.6.1 ships SQL/control version 0.6.0. Objects use the chosen installation schema; the old lexo schema was removed. superuser=false is not trusted=true. PGSTY patches lexo_next for native-type ordering and empty tables, and lexo_rebalance to preserve order independently of text collation.

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.6.01817161514pg_lexo-
RPMPIGSTY0.6.11817161514pg_lexo_$v-
DEBPIGSTY0.6.11817161514postgresql-$v-pg-lexo-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64N/AN/A
el8.aarch64N/AN/A
el9.x86_64N/AN/A
el9.aarch64N/AN/A
el10.x86_64N/AN/A
el10.aarch64N/AN/A
d12.x86_64N/AN/A
d12.aarch64N/AN/A
d13.x86_64N/AN/A
d13.aarch64
PIGSTY 0.6.1
PIGSTY 0.6.1
PIGSTY 0.6.1
N/AN/A
u22.x86_64
PIGSTY 0.6.1
PIGSTY 0.6.1
PIGSTY 0.6.1
N/AN/A
u22.aarch64
PIGSTY 0.6.1
PIGSTY 0.6.1
PIGSTY 0.6.1
N/AN/A
u24.x86_64
PIGSTY 0.6.1
PIGSTY 0.6.1
PIGSTY 0.6.1
N/AN/A
u24.aarch64
PIGSTY 0.6.1
PIGSTY 0.6.1
PIGSTY 0.6.1
N/AN/A
u26.x86_64N/AN/A
u26.aarch64N/AN/A

构建

您可以使用 pig build 命令构建 pg_lexo 扩展的 RPM / DEB 包:

pig build pkg pg_lexo         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_lexo 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

安装
pig install pg_lexo;          # 当前活跃 PG 版本安装
pig
pig ext install -y pg_lexo -v 18  # PG 18
pig ext install -y pg_lexo -v 17  # PG 17
pig ext install -y pg_lexo -v 16  # PG 16
dnf
dnf install -y pg_lexo_18       # PG 18
dnf install -y pg_lexo_17       # PG 17
dnf install -y pg_lexo_16       # PG 16
apt
apt install -y postgresql-18-pg-lexo   # PG 18
apt install -y postgresql-17-pg-lexo   # PG 17
apt install -y postgresql-16-pg-lexo   # PG 16

创建扩展:

CREATE EXTENSION pg_lexo;

用法

来源:

pg_lexo 0.6.0 提供 Base62 lexo 类型,用于稳定的用户可控排序。它可以在已有位置之前、之后或之间生成短值,使项目移动时不必重新编号全部行。该类型提供比较操作符,以及默认 B-tree 和哈希操作符类。

核心流程

CREATE EXTENSION pg_lexo;

CREATE TABLE items (
    id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    title text NOT NULL,
    position lexo NOT NULL UNIQUE DEFERRABLE
);

INSERT INTO items (title, position)
VALUES ('first', lexo_first());

INSERT INTO items (title, position)
SELECT 'last', lexo_after(position)
FROM items ORDER BY position DESC LIMIT 1;

INSERT INTO items (title, position)
VALUES ('middle', lexo_between('H'::lexo, 'I'::lexo));

SELECT * FROM items ORDER BY position;

lexo_first() 从 H 开始。lexo_after(lexo)、lexo_before(lexo) 和 lexo_between(lexo, lexo) 生成相邻位置;lexo_between 的任一参数可以为 NULL,表示开放的一端。输入只能包含 0-9、A-Z 和 a-z,其 ASCII 顺序与该类型的排序一致。

表辅助函数

lexo_next(table, position_column, key_column, key_value) 查找当前最大值并返回下一个位置,可选限定到某个分组。lexo_add_column(table, column) 添加 lexo 列。lexo_rebalance(table, position_column, key_column, key_value) 用均匀分布的位置重写匹配行,并返回更新行数。

这些辅助函数执行动态 SQL,调用者必须拥有相应表权限。重平衡会更新每条选中行,应与应用写入协调执行。如果位置列有唯一约束,应使用可延迟约束,并在重平衡事务中延迟检查,允许更新过程中出现临时重叠。位置生成本身不会预留值:并发会话可能得到相同位置,因此应建立合适的唯一约束,并在冲突时重试或串行化移动。当相邻位置之间(或最小值之前)没有可用 Base62 值时,应先重平衡。

0.6 版本边界

0.6 版移除了专用 lexo 模式。原来的 lexo.lexorank 类型改名为 lexo,lexo.first() 等模式限定函数改为 lexo_first() 等名称。旧示例必须迁移后才能使用。发行包版本 0.6.1 保留 SQL/control 版本 0.6.0,通过 pgrx 0.16.1 面向 PostgreSQL 16–18。Pigsty 软件包为 lexo_next 添加补丁,使用原生排序替代不存在的 max(lexo) 聚合,并让 lexo_rebalance 的顺序不受文本排序规则影响。

这个页面对您有帮助吗?