【发布时间】:2010-02-15 10:58:47
【问题描述】:
我正在尝试查看是否存在创建具有分区逻辑的序列的东西。 我需要一个依赖于其他主键 ex 的序列号:
id_person sequence id
1 | 1
1 | 2
2 | 1
3 | 1
1 | 3
所以序列必须依赖于id_person 分区。 oracle上有这样的东西还是我必须自己在应用程序级别实现它?
谢谢。
您好,已经创建了这个 PLSQL 包一个函数和过程:
PROCEDURE INIT_SEQUENCE(NAME varchar2, pkColumnNameList PARTITIONED_SEQUENCE_PK_COLUMN);
FUNCTION GET_NEXT_SEQUENCE_VALUE(NAME varchar2, pkPartitionColValue PARTITIONED_SEQUENCE_COL_VALUE) RETURN NUMBER;
INIT_SEQUENCE - 输入要在序列中关联的名称和列名列表,这些列名是固定序列的固定主键部分 Ex:'ID_PERSON'
此过程的工作是创建将根据 pkColumnNameList 列管理序列增量的表。
GET_NEXT_SEQUENCE_VALUE- 获取要递增的序列名称和 pkColumnNameList 主键的值,然后进行下一步: 1)动态创建sql来工作 2) dbms_lock.allocate_unique();锁定表 3) 检查表中是否存在输入中 pk 值的记录 4) 如果存在记录,则在序列列中使用 max + 1 更新记录 5)如果记录不存在,则在序列列中插入带有 1 的新记录 6)返回新的id;
我想提前收到对此的评论...
【问题讨论】:
-
您能详细说明什么是序列 ID 列吗?
-
1-10 或 100,000 的人 ID 会有多少... 可以有差距吗?如果只有几个人 ID,只需制作 n 个序列 - 也就是说,如果允许有间隙。不要注意那些吐槽并发问题的人,显然这不是一个严肃的应用程序,有数百个同时连接插入到这个表中。是吗?
-
好吧,这里有点讽刺,但总的来说我是认真的。人们在询问您期待多少插入之前开始抱怨并发。如果你每小时有 10 次插入,wtf 关心吗?
-
person_id 仅作为示例。我的意见是优化序列号 id'like 有,就像在上面的例子中,由 fir 部分主键分区排序的序列,在这个例子中分区是由 id_person 管理的,但这只是一个例子。