W odróżnieniu od innych baz, w Oraclu do wersji 11g, do tworzenia inkrementacji klucza głównego nie mogliśmy użyć zwyczajnie autonumeracji jak na poniższym przykładzie w MySQL
|
CREATE TABLE USERS ( ID int NOT NULL AUTO_INCREMENT, LastName varchar(255) NOT NULL, FirstName varchar(255), ); |
Zamiast tego trzeba było stosować wyzwalacz, który pobierał wartość z sekwencji.
|
CREATE TABLE user( ID NUMBER(10) NOT NULL, DESCRIPTION VARCHAR2(50) NOT NULL); ALTER TABLE user ADD ( CONSTRAINT user_pk PRIMARY KEY (ID)); CREATE SEQUENCE user_seq START WITH 1; / |
|
CREATE OR REPLACE TRIGGER user_biu BEFORE INSERT ON user FOR EACH ROW BEGIN SELECT user_bir.NEXTVAL INTO :new.id FROM dual; END; / |
Lata pózniej w wersji 12c wprowadzono możliwość określenia takiej właściwości przy tworzeniu tabeli, w prostszy sposób.
|
CREATE TABLE tabela( id NUMBER GENERATED ALWAYS AS IDENTITY, descripiton VARCHAR2(30) ); |
Funkcja sys_guid.
W niektórych przypadkach przydatna może być funkcja sys_guid generująca i zwracająca globalny, unikalny ID (RAW, do 16 bajtów). Składa się z id hosta, procesu lub id wątku oraz niepowtarzalnej wartości. Nie jest to inkrementacja tzn. nie są to kolejne „user-friendly” liczby, a wartości heksadecymalne (vide wynik przykładu 1. poniżej). Poza tym może być używana jako wartość domyślna w CREATE TABLE (DEFAULT)
|
CREATE TABLE tabela ( primary_key_column raw(16) DEFAULT sys_guid() primary key, ) |
Przykłady sys_guid():
1. Aktualizacja kolumny.
|
ALTER TABLE locations ADD (uid_col RAW(32)); UPDATE locations SET uid_col = SYS_GUID(); SELECT uid_col FROM locations; |
Wynik:
UID_COL
—————————————-
7CD5B7769DF75CEFE034080020825436
7CD5B7769DF85CEFE034080020825436
7CD5B7769DF95CEFE034080020825436
7CD5B7769DFA5CEFE034080020825436
…
2. Zastosowanie przy uzyciu wyzwalacza
|
CREATE OR REPLACE TRIGGER team_members_biu BEFORE INSERT OR UPDATE on team_members for each row BEGIN if :new.id is null then :new.id := to_number(sys_guid(), 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'); end if; :new.username := upper(:new.username); END team_members_biu; / |