Postgresql 如何在postgres 12中分区表的复合primarey键的列部分添加或模拟unicity约束?

Postgresql 如何在postgres 12中分区表的复合primarey键的列部分添加或模拟unicity约束?,postgresql,partition,Postgresql,Partition,我想做这样的事情: 创建表foo foo_id int, 餐具文本, 主键foo_id,餐具 唯一foo_id 按列表分割餐具; 为“spoon”中的值创建foo的表foo_spoon分区; 为“fork”中的值创建表foo_foo的fork分区; 但博士后抱怨: [0A000]错误:唯一约束定义中的列不足 细节:表foo上的唯一约束缺少列刀具,这是分区键的一部分 我可以为每个分区表在foo_id上添加一个唯一的约束,但它不会阻止执行类似的操作 在foo_spoon foo_id中插入餐具值1“

我想做这样的事情:

创建表foo foo_id int, 餐具文本, 主键foo_id,餐具 唯一foo_id 按列表分割餐具; 为“spoon”中的值创建foo的表foo_spoon分区; 为“fork”中的值创建表foo_foo的fork分区; 但博士后抱怨:

[0A000]错误:唯一约束定义中的列不足

细节:表foo上的唯一约束缺少列刀具,这是分区键的一部分

我可以为每个分区表在foo_id上添加一个唯一的约束,但它不会阻止执行类似的操作

在foo_spoon foo_id中插入餐具值1“spoon”;-这进入一个分区 在foo_fork foo_id中插入刀具值1“fork”;-这将进入另一个分区 是否有一个很好的方法来解决这个问题,唯一的解决方案是基于触发器的

使用触发器,我做了如下操作:

创建或替换函数\u检查\u复制\u foo\u id 将触发器返回为 $$ 开始 如果存在,则从foo中选择count*,其中foo.foo\u id=new.foo\u id具有count*1,然后 引发异常“重复的foo.foo_id%s”,新的.foo_id; 如果结束; 归还新的; 终止 $$语言plpgsql; 创建触发器\u检查\u复制\u foo\u id\u触发器 在foo_spoon上插入或更新后 对于每一行,执行过程\u检查\u复制\u foo\u id; -foo_fork也一样
这是正确的方向还是看起来完全疯狂?

没有内置的好方法来处理这个问题,因为在Postgres中如何实现独特的约束。委员会:

分区表上的唯一约束必须包括所有分区键列。这种限制的存在是因为PostgreSQL只能在每个分区中单独强制唯一性


唯一约束是使用索引实现的,每个索引只适用于单个分区,因此跨多个分区强制唯一性必须使用其他机制。

谢谢!我在医生里没看到。您对我刚刚发布的解决方案有何看法?我是sql新手,还不知道什么是好的,或者对性能、并发性等非常危险的。