日期:2014-05-17  浏览次数:20692 次

考虑到表频繁地插入和删除记录的情况,用序列(SEQUENCE)创建的主键值可以重复利用么?
本帖最后由 iw1210 于 2012-12-21 14:20:39 编辑
考虑到表频繁地插入和删除记录的情况,用序列(SEQUENCE)创建的主键值可以重复利用么?如果不能重复利用,序列岂不是很快就不够用了啊,应该可以重复利用吧,系统怎么处理这样情况的? SqlServer 的 IDENTITY 产生的序号也是可以重复利用的吧?

------解决方案--------------------
不能重复利用,会一直增长到最大值,如果创建时候指定了cycle参数,继续从最小值开始增长。
------解决方案--------------------
-- 可以,只要加个 cycle 关键字表示当序列值达到最大值后,轮循到从最小值开始。

-- 例如:

14:27:28 HR@myora > create sequence t_seq start with 1 increment by 1 maxvalue 10 nocache cycle;

序列已创建。

14:27:32 HR@myora > select t_seq.nextval from dual;

   NEXTVAL
----------
         1

已选择 1 行。

14:27:38 HR@myora > select t_seq.nextval from dual;

   NEXTVAL
----------
         2

已选择 1 行。

14:27:39 HR@myora > select t_seq.nextval from dual;

   NEXTVAL
----------
         3

已选择 1 行。

14:27:39 HR@myora > select t_seq.nextval from dual;

   NEXTVAL
----------
         4

已选择 1 行。

14:27:40 HR@myora > select t_seq.nextval from dual;

   NEXTVAL
----------
         5

已选择 1 行。

14:27:41 HR@myora > select t_seq.nextval from dual;

   NEXTVAL
----------
         6

已选择 1 行。

14:27:41 HR@myora > select t_seq.nextval from dual;

   NEXTVAL
----------
         7

已选择 1 行。

14:27:42 HR@myora > select t_seq.nextval from dual;

   NEXTVAL
----------
         8

已选择 1 行。

14:27:42 HR@myora > select t_seq.nextval from dual;

   NEXTVAL
----------
         9

已选择 1 行。

14:27:43 HR@myora > select t_seq.nextval from dual;

   NEXTVAL
----------
        10

已选择 1 行。

14:27:43 HR@myora > select t_seq.nextval from dual;

   NEXTVAL
----------
         1

已选择 1 行。

14:27:44 HR@myora > select t_seq.nextval from dual;

   NEXTVAL
----------
         2

已选择 1 行。

------解决方案--------------------
每张表都会有各自的生命周期,也会做数据迁移和数据清理。
也可以使用联合主键,ID+时间戳也可以保证数据唯一性,这样就可以循环使用序列了。
当然,设计还是得以实际业务为准
--