Oracle中自定义生成的"标识"列



我阅读了Oracle中Identity列的文档,详细信息如下:https://docs.oracle.com/en/database/other-databases/nosql-database/19.1/java-driver-table/creating-tables-identity-column.html文档中提到,序列生成器插入标识列的值是整数。这可以在这里找到https://docs.oracle.com/en/database/other-databases/nosql-database/19.1/java-driver-table/sequence-generator-attributes.html

现在,我的问题是:有没有一种方法可以为标识列生成自定义值?整数值以外。比如说,像"ID001"、"ID002"等字符串?
提前感谢

首先思考为什么要使用字符串作为主键

你觉得有什么优势吗?(除了使用更多存储?(

其次使用ID001等键,考虑如果您的行数超过1000,会发生什么。。。

一种解释是,您正在寻找该行的一些用户可读标识。这可以使用标准IDENTITY和一个额外的虚拟列来提供

示例

create table MY_TABLE (
ID number(19,0) generated as identity, 
ID_DESC varchar2(255 char) generated always as ('ID'||ID) virtual,
col int,
primary key (ID))
;
insert into my_table(col)
select rownum from dual connect by level <= 3;

select id, id_desc from  my_table order by id;
ID ID_DESC
---------- ---------        
1 ID1                                                                                                                                                                                                                                                            
2 ID2                                                                                                                                                                                                                                                            
3 ID3 

这是可能的,但您必须对此做点什么(即编写一些代码-一个触发器(。下面是一个例子。

样品表;其ID列应自动生成:

SQL> create table test (id varchar2(10), name varchar2(10));
Table created.

将在触发器中使用的序列:

SQL> create sequence seq_test;
Sequence created.

触发器相当简单;它将ID与一个序列号连接在一起,左边用零填充,长度最多为3个字符(正如您的示例所说(:

SQL> create or replace trigger trg_bi_test
2    before insert on test
3    for each row
4  begin
5    :new.id := 'ID' || lpad(seq_test.nextval, 3, '0');
6  end;
7  /
Trigger created.

测试:

SQL> insert into test (name) values ('Little');
1 row created.
SQL> insert into test (name)
2    select 'Foot'      from dual union all
3    select 'Equalizer' from dual;
2 rows created.
SQL> select * from test order by id;
ID         NAME
---------- ----------
ID001      Little
ID002      Foot
ID003      Equalizer
SQL>

p.S.您发布的链接与";传统的";Oracle数据库;检查例如CREATE TABLE文档,它包含有关标识列的信息。您的链接与NoSQL数据库相关。

最新更新