oracle 数据库中uuid的用例

fjaof16o  于 2023-01-08  发布在  Oracle
关注(0)|答案(3)|浏览(171)

例如,我有一个名为test的表,数据如下所示:

id name
1  John
2  Jay
3  Maria

假设test得到了更新,现在由于某种原因,ids的名称被分配给了不同的id,将name列视为唯一列,它不是test的p主键,而是唯一的。
下一次查询test时,它可能如下所示:

id name
    10  John
    12  Jay
    13  Maria

因此,在这种情况下,id发生了变化,但name是一致的,可以追溯到test表的前一个状态。但是我不能控制这个表,现在有些人就是这样处理数据的,我想知道这是否是使用uuid的一个好例子?我不熟悉uuid的概念,也不熟悉当我想要处理此表中的数据更改时,如何最好地创建一致的唯一可标识的并且在搜索上也快速的东西。我想在我这一端导入此表,但创建一个快速的并且在数据导入期间不会更改的键。

gr8qqesn

gr8qqesn1#

我觉得你想解决的问题并不清楚。
问题1:id列不断更新。这看起来很奇怪,所以找到发生这种情况的根源似乎是需要解决的真实的问题。
问题2:唯一标识行。您希望使用id列或新的uuid列来唯一标识,但您已经说过可以使用name列唯一标识行,那么您在这里试图解决什么问题?
问题3:性能。使用索引整数(最好是主键)列可以获得最佳性能。在这种情况下,最有可能的是id。uuid对性能没有帮助。
问题4:导入时数据发生变化。这可能是由于自动增量或DDL中设置的初始值不同。您需要更好地了解导入中到底出了什么问题。
问题5:如果你不能控制id列的值,你怎么能添加你自己的uuid呢?
UUID只是创建唯一值的一种方式。
Oracle有一个函数可以创建uuid random_uuid()。

pn9klfpd

pn9klfpd2#

这是一个XY问题。
表中的数据具有给定数据类型的唯一键,当重新加载该数据时,将重新生成唯一键,以便所有数据都获得新的唯一值。
您使用的数据类型并不重要;这个问题与重新加载数据和重新生成唯一键的过程有关。2如果你使用不同的数据类型,唯一键仍然重新生成,那么你会遇到完全相同的问题。
先解决那个问题。

1bqhqjot

1bqhqjot3#

先不说这个问题的原因,它是否有意义,如果我答对了,它是关于从NAME生成一个唯一的密钥,NAME本身是唯一的。
如果是这样的话,你可以创建一个on函数来完成这个工作:

CREATE OR REPLACE FUNCTION NAME_2_ID(p_name VARCHAR2) RETURN NUMBER AS 
BEGIN
--
  Declare
    mRet        Number(16);
    mAlpha  VarChar2(64);
    mWrk        Number(16) := 0;
    mANum   VarChar2(4000) := '';
--
  Begin
    IF p_name Is Null Then
      mRet := 0;
      GOTO End_It;
    END IF;
--
    mAlpha := ' ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'',.!?"()[]{}';
-- ---------------- Replacing  Alpha To Numeric -----------------------------------------------------------------------------------------------
    For i In 1 .. Length(p_name) Loop
        mANum := mANum || SubStr(p_name, i, 1) || To_Char(InStr(mAlpha, Upper(SubStr(p_name, i, 1)))) || '~';
        mWrk := mWrk + InStr(mAlpha, Upper(SubStr(p_name, i, 1)));
    End Loop;
    mRet := mWrk * Length(mANum);
<<End_It>>
    RETURN(mRet);
  End;
END NAME_2_ID;

由于TEST表格中的ID列与示例数据中的ID列一样发生变化:

WITH
    test_1 AS
        (
            Select 1 "ID", 'John'  "A_NAME" From Dual Union All
            Select 2 "ID", 'Jay'   "A_NAME" From Dual Union All
            Select 3 "ID", 'Maria' "A_NAME" From Dual 
        ),
    test_2 AS
        (
            Select 10 "ID", 'John'  "A_NAME" From Dual Union All
            Select 12 "ID", 'Jay'   "A_NAME" From Dual Union All
            Select 13 "ID", 'Maria' "A_NAME" From Dual 
        )

...无论何时查询该表(如果名称未更改),都可以获得相同的ID_2 ...

Select 
    ID,
    A_NAME,
    NAME_2_ID(A_NAME) "ID_2"
From
    test_1
/*
        ID A_NAME       ID_2
---------- ------ ----------
         1 John          765 
         2 Jay           429 
         3 Maria         846
*/

--  -------------------------
... ... ...
  From 
     test_2

/*
        ID A_NAME       ID_2
---------- ------ ----------
        10 John          765 
        12 Jay           429 
        13 Maria         846
*/

相关问题