oracle 主键产生方法

涉及到信息系统,构建的数据模型中必定涉及主键,如何产生主键呢?

(1)不可取:获取字段的最大值加1。设计主键字段为number类型的,每次录入取得的最大值作为新记录的标示。

改良方法(可取):在数据库中构建序列,然后插入数据时候执行序列即可。如:

Create Sequence SequenceNum --建序列
Increment By 1 --增加为1
Start With 1 --开始为1
Maxvalue 99999999 --最大

录入时候可以采取:insert into a(x)values(SequenceNum.nextval),这样就不会重复了。

同理:上面序列可以采取其他方法写,这个只是最大值加1的方法。

这样不可取的原因是:如果同时多人使用系统,所有人同时获得了目前主键id的最大值为2,那么同时录入的id将为3,那么会导致冲突问题。

(2)不可取:利用rowid作为主键。

不可取原因:因为rowid是伪列,是记录的实际存储空间的标示,如果将数据进行迁移等rowid会发生变化,那么与之关联的其他表中对应数据准确性无法保证。

(3)最好不用:sys_guid()系统给的函数。

最好不用的原因:SYS_GUID会保证它创建的标识符在每个数据库里都是唯一的。对于SYS_GUID而言,性能上的影响在查询时间和创建时间上(在表格里要创建更多的块和索引以容纳数据)SYS_GUID生成的值的另一个显著的不足之处是,管理这些值会变得困难得多。你必须(手动)输入它们或者通过脚本来填充它们,或者将它们作为Web参数来传递。出于这些原因,将SYS_GUID作为一个主关键字不是一个很好主意,除非是在一个并行的环境里或者希望避免使用管理序列生成器的情况下。

(4)可取:dbms_random方法。

select dbms_random.string('a',10) from dual,采用10位的字符来表示,这样重复几率很低。

insert into a(x) values('dbms_random.string('a',10)')

(5)自己写产生随机数的函数,这个方法最好,但是选择好合适的算法显得尤为重要。

猜你喜欢

转载自af8991.iteye.com/blog/1670879