详解oracle8i后,提供了一个生成不重复数据的函数sys_guid(),共32位。生成主要是基于时间和机器码,这在世界上是独一无二的,类似于java。UUID(在世界上都是唯一的)。SYS_GUIDSYS_GUID与Oracle管理员使用的传统序列相比具有许多优势。序列生成器简单地创建一个从给定起点开始的整数值序列,它用于在选择语句时自动递增序列。sequencegenerator生成的number只能保证在单个instance内唯一,不适合在parallel或者remote环境中作为primarykey使用,因为sequence在各个环境中可能生成相同的number,从而导致冲突。SYS_GUID将确保它创建的标识符在每个数据库中都是唯一的。还有,序列必须是DML语句的一部分,所以它需要往返数据库(否??则不能保证它的值是唯一的)。SYS_GUID源自不需要访问数据库的时间戳和机器标识符,从而节省了查询开销。使用SYS_GUID()生成32位唯一代码。生成唯一的主键例如:createtabletest(idraw(16)defaultsys_guid()primarykey,namevarchar2(100));insertintotestvalues(sys_guid(),'t1');这样会生成一个唯一的主键id,插入数据时不插入id列表。SYS_GUID作为主键?createtableuse_seq_table(idinteger);createsequenceuse_seq_sequence;insertintouse_seq_tablevalues(use_seq_sequence_value.nextval);createtableuse_guid_table(idraw(16));insertintouse_guid_table(sys_guid());关键词,这些数据行没有明显的主值,也就是说在这样的数据集中创建一条记录会导致数据列发生变化。因此,管理员可能会对在没有序列号的表中使用SYS_GUID作为主键感兴趣。这在对象在不同机器上的不同数据库中生成并且稍后需要合并在一起的情况下很有用。但是,SYS_GUID生成的值是一个16位原始值。序列生成的整数不会使用16位(值),除非它达到10的30次方(每个字节两位),并且数字非常独特:SQL>selectdump(123456789012345678901234567890)fromdual;更短的值意味着表和索引的存储空间更少,查询访问时间更短。使用SYS_GUID或者sequence会在数据库生命周期的某些地方造成性能消耗。对于SYS_GUID,性能影响是查询时间和创建时间(在表中创建更多块和索引以容纳数据)。对于序列,性能影响发生在查询期间,此时SGA序列的缓冲区已用完。默认情况下,一个序列一次缓冲20个值。如果数据库在没有使用这些值的情况下关闭,它们将会丢失。SYS_GUID生成的值的另一个显着缺点是管理它们变得更加困难。您必须(手动)输入它们或通过脚本填充它们,或将它们作为Web参数传递。由于这些原因,将SYS_GUID用作主键并不是一个好主意,除非在并行环境中或者如果您想避免使用管理序列生成器。总结与JAVA的uuid相比,SYS_GUID的优点是生成的字符串是唯一的,但是它也有和UUID一样的缺点:生成的序列太长且不规则,不方便记忆。SYS_GUID的应用场景是:当数据库中的某个字段被设置为唯一时,可以生成次要的(比如主键)。
