我想在Oracle中生成一个唯一的id,它包含字母数字,长度为9位。请帮助我

我想在Oracle中生成一个唯一的id,它包含字母数字,长度为9位。请帮助我,oracle,Oracle,我想在Oracle中生成一个唯一的id,它包含字母数字,长度为9位 我试过了 ==>从dual中选择substr(系统guid(),5,9)guid 它会有独特的性质吗? 请任何人帮帮我 谢谢你。不,这种方法没有唯一性。如果你想在列值中自动递增,你可以使用序列来实现这一点 CREATE OR REPLACE SEQUENCE dept_seq INCREMENT BY 1 START WITH 100000000 NOMAXVALUE NOCYCLE CACHE 10; 创建序列后,可以使用插

我想在Oracle中生成一个唯一的id,它包含字母数字,长度为9位

我试过了

==>从dual中选择substr(系统guid(),5,9)guid

它会有独特的性质吗? 请任何人帮帮我


谢谢你。

不,这种方法没有唯一性。

如果你想在列值中自动递增,你可以使用
序列来实现这一点

CREATE OR REPLACE SEQUENCE dept_seq
INCREMENT BY 1
START WITH 100000000
NOMAXVALUE
NOCYCLE
CACHE 10;
创建序列后,可以使用插入触发器后的
插入相同的值。
下面是一个触发器示例

CREATE OR REPLACE TRIGGER dep_ins_trig 
BEFORE INSERT ON <table_name> 
FOR EACH ROW

BEGIN
  SELECT dept_seq.NEXTVAL
  INTO   :new.emp_id
  FROM   dual;
END;
/
现在,您的
emp\u id
列将接受“全局唯一标识符值”。 您可以通过如下方式忽略emp_id列在表中插入值

CREATE TABLE <table_name> 
(emp_id RAW(16) DEFAULT SYS_GUID() PRIMARY KEY,
name VARCHAR2(30));
INSERT INTO <table_name> (name) VALUES ('name value');
插入(名称)值(“名称值”);

因此,它将向您的
emp\u id
列插入唯一值。

当您仅使用数字序列时,似乎过于复杂,但您可以:

Oracle 11g R2架构设置

CREATE OR REPLACE FUNCTION numberToAlnumString(
 n IN NUMBER
) RETURN VARCHAR2
AS
 i NUMBER := n;
 s VARCHAR2(9);
 r NUMBER(2,0);
BEGIN
  WHILE i > 0 LOOP
    r := MOD( i, 36 );
    i := ( i - r ) / 36;
    IF ( r < 10 ) THEN
      s := TO_CHAR(r) || s;
    ELSE
      s := CHR( 55 + r ) || s;
    END IF;
  END LOOP;
  RETURN LPAD( s, 9, '0' );
END;
/

CREATE SEQUENCE test__id__seq INCREMENT BY 1 START WITH 1
/

CREATE TABLE test (
  id CHAR(9) NOT NULL,
  name VARCHAR2(20)
)
/

CREATE OR REPLACE TRIGGER test_ins_trig 
BEFORE INSERT ON test
FOR EACH ROW
BEGIN
  :new.id := numberToAlnumString( test__id__seq.NEXTVAL );
END;
/

INSERT INTO test ( name )
SELECT TO_CHAR( LEVEL )
FROM DUAL
CONNECT BY LEVEL < 100
/
SELECT * FROM test
|        ID | NAME |
|-----------|------|
| 000000001 |    1 |
| 000000002 |    2 |
| 000000003 |    3 |
| 000000004 |    4 |
| 000000005 |    5 |
| 000000006 |    6 |
| 000000007 |    7 |
| 000000008 |    8 |
| 000000009 |    9 |
| 00000000A |   10 |
| 00000000B |   11 |
| 00000000C |   12 |
| 00000000D |   13 |
| 00000000E |   14 |
| 00000000F |   15 |
| 00000000G |   16 |
| 00000000H |   17 |
| 00000000I |   18 |
| 00000000J |   19 |
| 00000000K |   20 |
| 00000000L |   21 |
| 00000000M |   22 |
| 00000000N |   23 |
| 00000000O |   24 |
| 00000000P |   25 |
| 00000000Q |   26 |
| 00000000R |   27 |
| 00000000S |   28 |
| 00000000T |   29 |
| 00000000U |   30 |
| 00000000V |   31 |
| 00000000W |   32 |
| 00000000X |   33 |
| 00000000Y |   34 |
| 00000000Z |   35 |
| 000000010 |   36 |
| 000000011 |   37 |
| 000000012 |   38 |
| 000000013 |   39 |
| 000000014 |   40 |
| 000000015 |   41 |
| 000000016 |   42 |
| 000000017 |   43 |
| 000000018 |   44 |
| 000000019 |   45 |
| 00000001A |   46 |
| 00000001B |   47 |
| 00000001C |   48 |
| 00000001D |   49 |
| 00000001E |   50 |
| 00000001F |   51 |
| 00000001G |   52 |
| 00000001H |   53 |
| 00000001I |   54 |
| 00000001J |   55 |
| 00000001K |   56 |
| 00000001L |   57 |
| 00000001M |   58 |
| 00000001N |   59 |
| 00000001O |   60 |
| 00000001P |   61 |
| 00000001Q |   62 |
| 00000001R |   63 |
| 00000001S |   64 |
| 00000001T |   65 |
| 00000001U |   66 |
| 00000001V |   67 |
| 00000001W |   68 |
| 00000001X |   69 |
| 00000001Y |   70 |
| 00000001Z |   71 |
| 000000020 |   72 |
| 000000021 |   73 |
| 000000022 |   74 |
| 000000023 |   75 |
| 000000024 |   76 |
| 000000025 |   77 |
| 000000026 |   78 |
| 000000027 |   79 |
| 000000028 |   80 |
| 000000029 |   81 |
| 00000002A |   82 |
| 00000002B |   83 |
| 00000002C |   84 |
| 00000002D |   85 |
| 00000002E |   86 |
| 00000002F |   87 |
| 00000002G |   88 |
| 00000002H |   89 |
| 00000002I |   90 |
| 00000002J |   91 |
| 00000002K |   92 |
| 00000002L |   93 |
| 00000002M |   94 |
| 00000002N |   95 |
| 00000002O |   96 |
| 00000002P |   97 |
| 00000002Q |   98 |
| 00000002R |   99 |

CREATE OR REPLACE FUNCTION numberToAlnumString(
 n IN NUMBER
) RETURN VARCHAR2
AS
 i NUMBER := n;
 s VARCHAR2(9);
 r NUMBER(2,0);
BEGIN
  WHILE i > 0 LOOP
    r := MOD( i, 36 );
    i := ( i - r ) / 36;
    IF ( r < 10 ) THEN
      s := TO_CHAR(r) || s;
    ELSE
      s := CHR( 55 + r ) || s;
    END IF;
  END LOOP;
  RETURN LPAD( s, 9, '0' );
END;
/

CREATE SEQUENCE test__id__seq INCREMENT BY 1 START WITH 1
/

CREATE TABLE test (
  id CHAR(9) NOT NULL,
  name VARCHAR2(20)
)
/

CREATE OR REPLACE TRIGGER test_ins_trig 
BEFORE INSERT ON test
FOR EACH ROW
BEGIN
  :new.id := numberToAlnumString( test__id__seq.NEXTVAL );
END;
/

INSERT INTO test ( name )
SELECT TO_CHAR( LEVEL )
FROM DUAL
CONNECT BY LEVEL < 100
/
SELECT * FROM test
|        ID | NAME |
|-----------|------|
| 000000001 |    1 |
| 000000002 |    2 |
| 000000003 |    3 |
| 000000004 |    4 |
| 000000005 |    5 |
| 000000006 |    6 |
| 000000007 |    7 |
| 000000008 |    8 |
| 000000009 |    9 |
| 00000000A |   10 |
| 00000000B |   11 |
| 00000000C |   12 |
| 00000000D |   13 |
| 00000000E |   14 |
| 00000000F |   15 |
| 00000000G |   16 |
| 00000000H |   17 |
| 00000000I |   18 |
| 00000000J |   19 |
| 00000000K |   20 |
| 00000000L |   21 |
| 00000000M |   22 |
| 00000000N |   23 |
| 00000000O |   24 |
| 00000000P |   25 |
| 00000000Q |   26 |
| 00000000R |   27 |
| 00000000S |   28 |
| 00000000T |   29 |
| 00000000U |   30 |
| 00000000V |   31 |
| 00000000W |   32 |
| 00000000X |   33 |
| 00000000Y |   34 |
| 00000000Z |   35 |
| 000000010 |   36 |
| 000000011 |   37 |
| 000000012 |   38 |
| 000000013 |   39 |
| 000000014 |   40 |
| 000000015 |   41 |
| 000000016 |   42 |
| 000000017 |   43 |
| 000000018 |   44 |
| 000000019 |   45 |
| 00000001A |   46 |
| 00000001B |   47 |
| 00000001C |   48 |
| 00000001D |   49 |
| 00000001E |   50 |
| 00000001F |   51 |
| 00000001G |   52 |
| 00000001H |   53 |
| 00000001I |   54 |
| 00000001J |   55 |
| 00000001K |   56 |
| 00000001L |   57 |
| 00000001M |   58 |
| 00000001N |   59 |
| 00000001O |   60 |
| 00000001P |   61 |
| 00000001Q |   62 |
| 00000001R |   63 |
| 00000001S |   64 |
| 00000001T |   65 |
| 00000001U |   66 |
| 00000001V |   67 |
| 00000001W |   68 |
| 00000001X |   69 |
| 00000001Y |   70 |
| 00000001Z |   71 |
| 000000020 |   72 |
| 000000021 |   73 |
| 000000022 |   74 |
| 000000023 |   75 |
| 000000024 |   76 |
| 000000025 |   77 |
| 000000026 |   78 |
| 000000027 |   79 |
| 000000028 |   80 |
| 000000029 |   81 |
| 00000002A |   82 |
| 00000002B |   83 |
| 00000002C |   84 |
| 00000002D |   85 |
| 00000002E |   86 |
| 00000002F |   87 |
| 00000002G |   88 |
| 00000002H |   89 |
| 00000002I |   90 |
| 00000002J |   91 |
| 00000002K |   92 |
| 00000002L |   93 |
| 00000002M |   94 |
| 00000002N |   95 |
| 00000002O |   96 |
| 00000002P |   97 |
| 00000002Q |   98 |
| 00000002R |   99 |

您的意思是在您的数据库中是唯一的还是在整个宇宙中是唯一的?您的意思是您希望在表中自动生成唯一的ID列?是的,先生。我希望我的表中自动生成的ID列是唯一的。@Santhosh看一下我回答中的示例。当您可以使用oracle序列生成数字时,为什么要使用字母数字?我的意思是,是否有一些逻辑;像emp记录一样,您想要类似“EMP000001”、部门“DPT000001”或类似的东西吗?谢谢您的回答。我想生成9位长度的唯一Id。@Santhosh-在这种情况下,您必须使用
触发器
序列
,但您只能得到其中的数值。@Santhosh-请参阅答案更新(第一部分),也许会有帮助。