Home > Back-end >  Custom generated Identity column in Oracle
Custom generated Identity column in Oracle

Time:11-24


I read the documentation for Identity columns in Oracle as detailed here: https://docs.oracle.com/en/database/other-databases/nosql-database/19.1/java-driver-table/creating-tables-identity-column.html

The documentation mentions that the values that get inserted by the sequence generator into the identity column are integers. This can be found here https://docs.oracle.com/en/database/other-databases/nosql-database/19.1/java-driver-table/sequence-generator-attributes.html

Now, my question is this: Is there a way to have custom values generated for the identity column? Other than integer values. Say, a string like 'ID001', 'ID002' etc?
Many thanks in advance

CodePudding user response:

First think why should you use strings as a primary key.

Do you see some advantage? (Other than using more storage?)

Secondly with your key such as ID001 consider what should happen if you have more than 1000 rows...

One explanation is that you are looking for some user readable identification of the row. This can be provided using the standard IDENTITY plus an additional virtual column

Example

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 

CodePudding user response:

It is possible, but you'll have to do something about it (i.e. write some code - a trigger). Here's an example.

Sample table; its ID column should be auto-generated:

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

Table created.

A sequence, which will be used in a trigger:

SQL> create sequence seq_test;

Sequence created.

Trigger is rather simple; it concatenates ID with a sequence number, left-padded with zeroes up to 3 characters in length (as your example says so):

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.

Testing:

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. Link you posted isn't related to "traditional" Oracle database; check e.g. CREATE TABLE documentation, it contains info about identity columns. Your link is related to NoSQL database.

  • Related