加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何创建PostgreSQL分区序列?

发布时间:2020-12-13 16:29:50 所属栏目:百科 来源:网络整理
导读:是否有一种简单的(即非hacky)和无竞争条件的方法来在PostgreSQL中创建分区序列.例: 在问题中使用正常序列: | Project_ID | Issue || 1 | 1 || 1 | 2 || 2 | 3 || 2 | 4 | 在问题中使用分区序列: | Project_ID | Issue || 1 | 1 || 1 | 2 || 2 | 1 || 2 |
是否有一种简单的(即非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函数和触发器的例子……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读