我们可以把product_sequence.currval放在主键赋值, 而不用手动每次定义. 是否又再一次接近我们目的.
注意我们在定义使用了Cycle选项:即当序列自增到最大值或最小值时产生循环效果. 我们来看下实例.
--一直执行赋值语句 直到达到序列上限的最大值10
select product_sequence.nextval from ProductType
执行最后结果:

当我们再次执行赋值语句时 结果:

序列的值有最大上限10 又再次恢复到初始值1,实现一次循环. 如果再次执行其实同第一次执行时一样的,Cycle实现序列在一个特定范围内循环定义使用.
(C)使用序列填充主键-(核心内容)
上面做的都是准备工作, 我们要的最后结果即是在主键列中通过序列来自动赋值.当然前提表的主键定义时数据类型必须为整数. 在这里我还要再次提一下Cache这个选项.在使用序列填充主键时,常用设置为NoCache即采取默认方式. 当关闭数据库连接时所缓存的值会全部丢失. 导致主键产生的数值不连续的现象. 使用序列来填充主键标识:
1 --插入数据 时 序列值代替主键值定义
2 insert into ProductType(typeid,Typename,Createdate)
3 values(product_sequence.nextval,'使用了序列定义主键',default)
这种方式不必每次添加数据时查看主键的数值. 害怕插入重复数据. 而主键列的赋值工作完全交给序列来做. 我只需把精力投放在其他地方.
上面操作基本实现我们当初预想. 但我也想提出一个问题:
在微软的SQL Server平台上定义独立表结构的主键时. 可以同时指定多个列共同标识为该表的主键. 即如果多个合并在一起比对实现主键唯一标识. 而Oracle 10G中序列其实就分离这种关系. 两者之间相互独立. 也就是说主键的定义和主键赋值 是没有关-系的. 完全分开的. 序列只是负责独立的对主键进行赋值. 而至于主键约束的定义 没有关系.
(D)修改和删除序列
可以通过Alert Sequence子句来修改序列, 但是我在修改序列中常常会报错 而且很频繁.修改序列内容有如下限制:
(1)不能修改序列的初始值
(2)序列的最小值不能大于当前值
(3)序列的最大值不能小于当前值
修改序列的增量:
1 --修改序列的增量为2
2 alert sequence product_sequence increment by 2;
再次查询数据结果将以每次增量为2 增加. 如果在不使用情况下删除序列:
1 --删除序列 极其简单.
2 drop sequence product_sequence;
当我们添加多张表表中序列时, 我们可以同查询系统中User_sequences表来获取相关表的关于序列的详细信息. User_sequences是字典表的一部分.
至此以上是在Oracle 10G关于序列的全部用法.
摘自 猴子的博客