Vlastní generované Identity sloupec v Oracle

0

Otázka


Přečetl jsem si dokumentaci k Identity sloupce v Oracle jako podrobně zde: https://docs.oracle.com/en/database/other-databases/nosql-database/19.1/java-driver-table/creating-tables-identity-column.html

Dokumentace uvádí, že hodnoty, které se vloží sekvenci generátor do sloupce identity jsou celá čísla. To lze nalézt zde https://docs.oracle.com/en/database/other-databases/nosql-database/19.1/java-driver-table/sequence-generator-attributes.html

Teď moje otázka je tato: Je tam způsob, jak mít vlastní hodnoty vytvořené pro sloupec identity? Jiné než celočíselné hodnoty. Řekl, jako řetězec 'ID001', 'ID002' atd.?
Mnohokrát děkuji předem

oracle sql
2021-11-24 06:26:45
2

Nejlepší odpověď

2

Nejprve se zamyslete, proč byste měli používat řetězce jako primární klíč.

Vidíš nějakou výhodu? (Jiné než pomocí více paměti?)

Za druhé s klíčem, např. ID001 zvažte, co se stane, když máte více než 1000 řádků...

Jedním z vysvětlení je, že hledáte pro některé uživatele čitelné identifikace řádku. To lze za předpokladu použití standardní TOTOŽNOSTI plus další virtuální sloupec

Příklad

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 
2021-11-24 10:43:34

Děkuji MarmiteBomber. To dává další dobré perspektivy. Odpověď dána @Littlefoot vysvětluje to, co jsem chtěl. Budu měnit značku. Omlouvám se za zmatení.
TheEqualizer
0

To je možné, ale budete muset něco udělat (tj. napsat nějaký kód - trigger). Zde je příklad.

Vzorek tabulka; sloupec ID by mělo být auto-generated:

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

Table created.

Sekvence, která bude použita v trigger:

SQL> create sequence seq_test;

Sequence created.

Spoušť je poměrně jednoduchý; to zřetězí ID s pořadovým číslem, vlevo-polstrovaný s nulami 3 znaky (jako například to říká):

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.

Testování:

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. Odkaz, který jste zaslali, není vztahující se k "tradiční" databáze Oracle; podívejte se např. VYTVOŘIT TABULKU dokumentace, obsahuje info o identity sloupce. Váš odkaz se vztahuje k NoSQL databáze.

2021-11-24 08:02:17

To pomáhá @Littlefoot. Děkuji. Omlouvám se, že jsem nesprávně přidělených tag :)
TheEqualizer

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................