我来自我们拥有唯一标识符的 SQL 服务器世界。oracle中是否有等价物?此列将被频繁查询,因此性能是关键。
我在 .Net 中生成 GUID 并将其传递给 Oracle。由于几个原因,它不能由 oracle 生成,所以我不能使用序列。
CREATE table test (testguid RAW(16) default SYS_GUID() )
该博客研究了相对性能。
正如其他人所说,与数字序列相比,使用 GUID 会降低性能。也就是说,自 Oracle 8i 起就有一个名为“ SYS_GUID() ”的函数可用,它提供原始等价物:
SQL> SELECT SYS_GUID() FROM DUAL;
SYS_GUID()
--------------------------------
248AACE7F7DE424E8B9E1F31A9F101D5
可以创建一个函数来返回格式化的 GUID:
CREATE OR REPLACE FUNCTION GET_FORMATTED_GUID RETURN VARCHAR2 IS guid VARCHAR2(38) ;
BEGIN
SELECT SYS_GUID() INTO guid FROM DUAL ;
guid :=
'{' || SUBSTR(guid, 1, 8) ||
'-' || SUBSTR(guid, 9, 4) ||
'-' || SUBSTR(guid, 13, 4) ||
'-' || SUBSTR(guid, 17, 4) ||
'-' || SUBSTR(guid, 21) || '}' ;
RETURN guid ;
END GET_FORMATTED_GUID ;
/
因此返回一个可互换的字符串:
SQL> SELECT GET_FORMATTED_GUID() FROM DUAL ;
GET_FORMATTED_GUID()
--------------------------------------
{15417950-9197-4ADD-BD49-BA043F262180}
应该注意的是,一些 Oracle 平台返回的 GUID 值相似但仍然是唯一的值,正如Steven Feuerstein 所指出的那样。
2020 年 11 月 3 日更新:在 10g 中,Oracle 添加了对正则表达式函数的支持,这意味着可以使用该REGEXP_REPLACE()
函数简化连接。
REGEXP_REPLACE(
SYS_GUID(),
'([0-9A-F]{8})([0-9A-F]{4})([0-9A-F]{4})([0-9A-F]{4})([0-9A-F]{12})',
'{\1-\2-\3-\4-\5}'
)
该表达式将 by 返回的字符串值分解SYS_GUID()
为 5 组十六进制值并重建它,在每组之间插入一个“-”。
如果我正确理解了这个问题,您希望在数据库中插入一行时生成一个唯一的 id。
您可以使用序列来执行此操作。 链接在这里
一旦你创建了你的序列,你可以像这样使用它:
INSERT INTO mytable (col1, col2) VALUES (myseq.NEXTVAL, 'some other data');
RAW(16) 显然是唯一标识符 MS SQL 类型的首选等效项。
GUID 在 Oracle 中不像在 MSSQL 中那样使用,我们倾向于有一个 NUMBER 字段(不是 null 和主键)、一个序列和一个插入触发器来填充它(对于每个表)。
Oracle 中没有唯一标识符。
您可以使用 RAW(有点痛苦)或 CHAR 自己实现一个。与使用整数相比,在 CHAR 字段上 JOIN 的查询的性能会受到影响(可能高达 40%)。
如果您正在做分布式/复制数据库,那么性能损失是值得的。否则,只需使用整数。
使用 Oracle 的一般做法是创建人工密钥。这是一个定义为数字的列。它通过序列填充。它通过主键定义进行索引/约束。