oracle主键的设置自增,Oracle 设置主键
最近我总结了oracle主键的设置方法,粘贴到这里保存。设置主键有两种方式,一种是增长主键,另一种是生成唯一序列。1.自增主键——首先,建一个表测试。
?创建测试(nidint主键,test1 varchar2 (20),test2 varchar2 (20),test3 varchar2 (20),test4 varchar2 (20),test5 varchar 2(20))-构建另一个序列SEQ _测试
?创建序列seq _ test min value 1-最小值nomaxvalue -不设置最大值startwith1-count从1开始递增1-每次加1 nocycle一直累加,不循环nocache-不要建立缓冲区。
上面的代码完成了建立一个序列的过程,命名为SEQ _测试,范围从1到无穷大(无穷大的次数由你的机器决定),nocycle决定不循环。如果设置了最大值,可以使用cycle使序列循环到最大值。对于nocache,顺便说一下,如果你给了缓存值,系统会自动按seq读取你的缓存值的大小,这样在重复操作的时候会加快操作速度。但是如果遇到意外情况,比如死机或者oracle死了,下次取出的seq值会和上次不一致。(如果不一致没关系,建议用缓存,因为时间就是金钱!)
你只有表和序列是不够的。您最好构建另一个触发器来执行它!代码如下:在每行的INSERT ON test WHEN(new . NID为null)begin之前创建或替换触发器TG _ test select seq _ test . nextval into:new . NID from dual;结束;这是测试?select * from test insert into test(NID,test1) values (6, AAA )insert into test(test1)values( BBB )II。唯一序列SYS_GUID()生成一个32位的唯一代码。
序列生成器生成的数只能保证在单个实例中是唯一的,因此不适合在并行或远程环境中用作主键,因为它们各自环境中的序列可能生成相同的数,从而导致冲突。SYS_GUID将确保它创建的标识符在每个数据库中是唯一的。
另外,序列必须是DML语句的一部分,所以它需要往返数据库(否则不能保证它的值是唯一的)。SYS_GUID来源于时间戳和机器标识符,不需要访问数据库,节省了查询消耗。
许多应用程序依赖序列生成器来创建数据行的主键,这些数据行没有明显的主值。也就是说,在这样的数据集中创建记录将改变数据列。因此,管理员可能会对使用SYS_GUID而不是表中的序列号作为主键感兴趣。当对象在不同机器的不同数据库中生成,并且需要在以后合并在一起时,这是很有用的。
使用SYS_GUID或sequence会导致数据库生命周期中某些地方的性能消耗;这就是问题所在。对于SYS_GUID,性能影响表现在查询时间和创建时间上(应该在表中创建更多的块和索引来容纳数据)。对于序列来说,性能影响发生在查询期间,此时SGA序列的缓冲区将被用尽。默认情况下,序列一次缓冲20个值。如果关闭数据库而不使用这些值,它们将会丢失。
SYS_GUID生成的值的另一个显著缺点是,管理这些值将变得更加困难。您必须(手动)输入它们,或者用脚本填充它们,或者将它们作为Web参数传递。由于这些原因,使用SYS_GUID作为主键不是一个好主意,除非是在并行环境中,或者如果您想避免使用托管序列生成器。