当前位置: 首页 > news >正文

PG 分区表的缺陷

简介

好久没发文,是最近我实在不知道写点啥。随着国产化进程,很多 oracle 都在进行迁移,最近遇到了一个分区表迁移之后唯一性的问题。oracle 数据库中创建主键或者唯一索引,不需要引用分区键,但是 PG 就不行,PG 创建主键或者唯一键需要带上分区键,这样一来其唯一性就受到了破坏。

PG 创建测试语句
 postgres=# CREATE TABLE hash_sales (
postgres(#     id         INT,
postgres(#     sale_date  DATE,
postgres(#     amount     NUMERIC,
postgres(#     PRIMARY KEY (id)  -- 主键必须包含分区键
postgres(# ) PARTITION BY hash(sale_date );
ERROR:  unique constraint on partitioned table must include all partitioning columns
DETAIL:  PRIMARY KEY constraint on table "hash_sales" lacks column "sale_date" which is part of the partition key.
postgres=#

报错信息:
ERROR: unique constraint on partitioned table must include all partitioning columns DETAIL: PRIMARY KEY constraint on table "hash_sales" lacks column "sale_date" which is part of the partition key.
创建唯一约束也是如此,需要带上分区键。
这里我们使用 AI 看看 AI 的建议
在这里插入图片描述
AI 的回答也是不太让人满意。如果不能实现 PRIMARY KEY (id) ,那么整体的业务属性都将受到破坏
在分区表中创建 UNIQUE 约束,同样也是需要带上分区键的
报错信息:

postgres=# CREATE TABLE hash_sales ( postgres(# id INT, postgres(# sale_date DATE, postgres(# amount NUMERIC, postgres(# UNIQUE (id) postgres(# ) PARTITION BY hash(sale_date); ERROR: unique constraint on partitioned table must include all partitioning columns DETAIL: UNIQUE constraint on table "hash_sales" lacks column "sale_date" which is part of the partition key. postgres=#
其方法 3 在子表加主键。这个方法显然是无法满足的,并不能保证 ID 的全局唯一性。

下面是其他 AI 的回答

以上回答的 1、4 是不满足 ID 的全局唯一的,这里说的 2、3 方法。
创建触发器,相当于用 PG10 版本以前的继承式分区的方法,使用触发器显然会较大影响到其性能。看是可行实际维护却并不是那么方便。
第三个回答,使用一个小表,这个应用层的框架就要跟着一起,就像在架构上增加了一个布隆过滤器。
这里 AI 还回答了使用外键约束,同事一看能创建成功,感觉可以用了。实际外键只能保证其值存在的合理性,并不能保证其值存在的全局唯一性。

postgres=# CREATE TABLE id_tbale (
postgres(# id varchar(80),
postgres(# location point,
postgres(# primary key(id)
postgres(# );
CREATE TABLEpostgres=# CREATE TABLE hash_sales (
postgres(# id varchar(80) REFERENCES public.id_tbale(id),
postgres(# sale_date DATE,
postgres(# amount NUMERIC
postgres(# ) PARTITION BY hash(sale_date);
CREATE TABLE 

目前测试在 PG16、15 均存在这个问题。目前postgresql17\18的released中也并没有对这个问题进行调整。

相关文章:

  • 自制操作系统(五、重写引导部分和C语言的使用)
  • c++学习-this指针
  • 【仿生机器人】仿生机器人智能架构:从感知到个性的完整设计
  • 《Progressive Transformers for End-to-End Sign Language Production》复现报告
  • 【LangchainAgent】Agent基本构建与使用
  • 第七章 监听一致性协议 A Primer on Memory Consistency and Cache Coherence - 2nd Edition
  • 【C/C++】std::vector成员函数清单
  • 零基础在实践中学习网络安全-皮卡丘靶场(第十六期-SSRF模块)
  • 字符串字典序最大后缀问题详解
  • 迷宫问题(一)(C++版本)
  • 《高等数学》(同济大学·第7版)第二章第四节“隐函数及由参数方程所确定的函数的导数“
  • linux进程管理之从内存/cpu角度使用setrlimirt/rlimit
  • 【题解-洛谷】P1706 全排列问题
  • 露亦如电 · 时之沙 | 让遗憾在灰烬里随风而去
  • natapp 内网穿透失败
  • windows使用脚本杀死python进程
  • c++ —— 内存管理
  • SWE-Dev:开启自主特征驱动软件开发新纪元,重新定义大模型编码能力边界
  • DAY 44 预训练模型
  • 嵌入式知识篇---Zigbee串口
  • b站视频推广费用一般多少/网页开发用什么软件
  • 做响应式网站的菜单/网络营销案例分析ppt
  • 省建设安全监督站的网站/滕州seo
  • 定制手机壳的网站/软文推广收费
  • 义乌网站建设成都网站设计/不受限制的搜索引擎
  • 哪个网站做国际生意/关键词优化平台有哪些