How to generate a GUID in Oracle?
是否可以将GUID自动生成为Insert语句?
另外,应使用哪种类型的字段来存储此GUID?
您可以使用SYS_GUID()函数在您的插入语句中生成GUID:
1 | insert into mytable (guid_col, data) values (sys_guid(), 'xxx'); |
用于存储GUID的首选数据类型是RAW(16)。
正如Gopinath的回答:
1 2 3 4 5 | select sys_guid() from dual union all select sys_guid() from dual union all select sys_guid() from dual |
你得到
88FDC68C75DDF955E040449808B55601
88FDC68C75DEF955E040449808B55601
88FDC68C75DFF955E040449808B55601
正如托尼·安德鲁斯所说,只有一个字符有所不同
88FDC68C75DDF955E040449808B55601
88FDC68C75DEF955E040449808B55601
88FDC68C75DFF955E040449808B55601
可能有用:http://feuerthoughts.blogspot.com/2006/02/watch-out-for-sequential-oracle-guids.html
您还可以将guid默认包含在表的create语句中,例如:
1 2 3 4 5 | create table t_sysguid ( id raw(16) default sys_guid() primary key , filler varchar2(1000) ) / |
看到这里:http://rwijk.blogspot.com/2009/12/sysguid.html
尚不清楚将guid自动生成为insert语句的含义,但据推测,我认为您正在尝试执行以下操作:
1 2 | INSERT INTO MY_TAB (ID, NAME) VALUES (SYS_GUID(), 'Adams'); INSERT INTO MY_TAB (ID, NAME) VALUES (SYS_GUID(), 'Baker'); |
在那种情况下,我认为ID列应声明为RAW(16);
我正在这样做。我没有要测试的Oracle实例,但是我认为这就是您想要的。
找到以下示例:
http://www.orafaq.com/usenet/comp.databases.oracle.server/2006/12/20/0646.htm
1 | SELECT REGEXP_REPLACE(SYS_GUID(), '(.{8})(.{4})(.{4})(.{4})(.{12})', '\\1-\\2-\\3-\\4-\\5') MSSQL_GUID FROM DUAL |
结果:
1 | 6C7C9A50-3514-4E77-E053-B30210AC1082 |
sys_guid()是一个较差的选择,如其他答案所述。生成UUID并避免顺序值的一种方法是自己生成随机的十六进制字符串:
1 2 3 4 5 6 | select regexp_replace( to_char( DBMS_RANDOM.value(0, power(2, 128)-1), 'FM0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'), '([a-f0-9]{8})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{4})([a-f0-9]{12})', '\\1-\\2-\\3-\\4-\\5') from DUAL; |
您可以使用函数波纹管来生成您的UUID
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | create or replace FUNCTION RANDOM_GUID RETURN VARCHAR2 IS RNG NUMBER; N BINARY_INTEGER; CCS VARCHAR2 (128); XSTR VARCHAR2 (4000) := NULL; BEGIN CCS := '0123456789' || 'ABCDEF'; RNG := 15; FOR I IN 1 .. 32 LOOP N := TRUNC (RNG * DBMS_RANDOM.VALUE) + 1; XSTR := XSTR || SUBSTR (CCS, N, 1); END LOOP; RETURN SUBSTR(XSTR, 1, 4) || '-' || SUBSTR(XSTR, 5, 4) || '-' || SUBSTR(XSTR, 9, 4) || '-' || SUBSTR(XSTR, 13,4) || '-' || SUBSTR(XSTR, 17,4) || '-' || SUBSTR(XSTR, 21,4) || '-' || SUBSTR(XSTR, 24,4) || '-' || SUBSTR(XSTR, 28,4); END RANDOM_GUID; |
由上面的函数生成的GUID示例:
8EA4-196D-BC48-9793-8AE8-5500-03DC-9D04
您可以运行以下查询
1 2 3 4 5 | select sys_guid() from dual union all select sys_guid() from dual union all select sys_guid() from dual |
如果需要非顺序引导,则可以通过哈希函数发送
例如:
1 | LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) |
显示默认顺序guid与通过哈希发送它的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL UNION ALL SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL UNION ALL SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL UNION ALL SELECT LOWER(SYS_GUID()) AS OGUID FROM DUAL UNION ALL SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL UNION ALL SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL UNION ALL SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL UNION ALL SELECT LOWER(SUBSTR(STANDARD_HASH(SYS_GUID(), 'SHA1'), 0, 32)) AS OGUID FROM DUAL |
输出
1 2 3 4 5 6 7 8 | 80c32a4fbe405707e0531e18980a1bbb 80c32a4fbe415707e0531e18980a1bbb 80c32a4fbe425707e0531e18980a1bbb 80c32a4fbe435707e0531e18980a1bbb c0f2ff2d3ef7b422c302bd87a4588490 d1886a8f3b4c547c28b0805d70b384f3 a0c565f3008622dde3148cfce9353ba7 1c375f3311faab15dc6a7503ce08182c |