如何创建PostgreSQL分区序列?

前端之家收集整理的这篇文章主要介绍了如何创建PostgreSQL分区序列?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
是否有一种简单的(即非hacky)和无竞争条件的方法来在Postgresql中创建分区序列.例:

在问题中使用正常序列:

| Project_ID | Issue |
| 1          | 1     |
| 1          | 2     |
| 2          | 3     |
| 2          | 4     |

在问题中使用分区序列:

| Project_ID | Issue |
| 1          | 1     |
| 1          | 2     |
| 2          | 1     |
| 2          | 2     |
我不相信有一种简单的方法就像常规序列一样简单,因为:

>序列仅存储一个数字流(下一个值等).你想为每个分区一个.
>序列具有绕过当前事务的特殊处理(以避免竞争条件).如果不使用像dblink这样的技巧,很难在sql或PL / pgsql级别复制它.
> DEFAULT列属性可以使用简单表达式或函数调用,如nextval(‘myseq’);但它不能引用其他列来通知函数该值应该来自哪个流.

你可以制作有用的东西,但你可能不会认为它很简单.依次解决上述问题:

>使用表来存储所有分区的下一个值,使用multiseq(partition_id,next_val)等模式.
>编写一个多字节(seq_table,partition_id)函数,它执行以下操作:

>创建一个独立于当前事务的新事务(这样做的一种方法是通过dblink;我相信其他一些服务器语言可以更容易地完成它).
>锁定seq_table中提到的表.
>使用递增的值更新分区ID为partition_id的行. (如果没有,则插入值为2的新行.)
>提交该事务并返回先前存储的id(或1).

>在项目表上创建一个插入触发器,该插入触发器使用对multinextval(‘projects_table’,NEW.Project_ID)的调用进行插入.

我自己并没有使用过这整个计划,但我已经尝试过类似于每个步骤的内容.如果你想尝试这个,可以提供multinextval函数和触发器的例子……

猜你在找的Postgre SQL相关文章