Ha primary key mezőinkben egyedi számozást szeretnénk használni gyorsan rájöhetünk, hogy ahány RDBMS annyi megoldást nyújt erre a kérdésre. Egy rövid sorozattal szeretném az áttekintést segíteni, hogy ez mely adatbázis kezelőnél, hogyan is megy.
Ezúttal az Oracle által kínált megoldásokat mutatom be röviden.
Az ORACLE is azok közé tartozik akik nem támogatják az identity kiterjesztés a mezőikhez, így nem lehet auto increment mezőt definiálni. Auto increment helyett van szekvencia!
A szekvencia egy olyan objektum amely fejben tart egy értéket nekünk és azt ha kell megfelelő értékkel növeli. Csináljunk is gyorsan egy szekvenciát!
CREATE SEQUENCE S1
MINVALUE 50
MAXVALUE 999999999999999999999999999
START WITH 100
INCREMENT BY 1;
Így ni. Most létrehoztunk egy szekvenciát, amely 100-ról indul és egyesével növeli az értékét addig a sok 9-e számig. Megjegyzem, csak a leggyakrabban használt kapcsolókat muttattam meg, még egy csomó dolgot lehet állítani. De van másik véglet is: amikor csak Create Sequence min_seq-et adunk. Ez is létrehoz egy szekvenciát.
Kérjük el a következő értéket a szekvenciából: SELECT s1.NEXTVAL FROM Dual
Kérjük el az aktuális értéket a szekvenciából: SELECT s1.CURRVAL FROM Dual
Nagyon ott van! De hogy lesz ebből id mező-érték? Hát így pl.:
CREATE TABLE T1 (
id NUMBER(10)
,adat VARCHAR2(50)
,CONSTRAINT t1_pk PRIMARY KEY (id)
);
CREATE SEQUENCE T1_seq;
INSERT INTO T1 VALUES (T1_seq .NEXTVAL, 'Első');
Probáltam Default-ba tenni, de nem hagyta, triggert meg ezért csak nem írok! :(
Van még egy érdekesség ezzel a témával kapcsolatban! Ha módosítani szeretnénk a jelenlegi értéket ahhoz egy (szerintem) elég primitív megoldáshoz kell nyúlni. Mondjunk áll a számláló 100-on és 1000-re akarom módosítani. Akkor a következőt csinálom
ALTER SEQUENCE S1 INCREMENT BY 900 --1000-100 !!!
SELECT S1 .NEXTVAL FROM Dual
ALTER SEQUENCE S1 INCREMENT BY 1
Hogy, erre miért nincs egy setvalue függvény azt csak Kaliforniában tudják. :)