Votre navigateur n'est pas à jour !

Merci de mettre à jour votre navigateur pour utiliser mon blog. Mettre à jour mon navigateur maintenant

×

Base de données - Générer un auto incrément sur Oracle

Date de publication 13 juin 2016
Cela peut paraitre complètement fou mais dans les versions inférieures à ORACLE 12c (sortie en 2013) cette base de donnée ne possède pas d'auto incrément !
http://docs.oracle.com/database/121/DRDAA/migr_tools_feat.htm#DRDAA109

Donc en 12c c'est assez simple
CREATE TABLE t1 (c1 NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY, c2 VARCHAR2(10));

Par contre dans les versions inférieures à 12c il faudra le faire à la main :
  • Générer une simple table avec une colonne faisait office d'auto incrément, ici ID
    CREATE TABLE MYTABLE (
      ID    NUMBER(10)    NOT NULL,
      NAME  VARCHAR2(10)  NOT NULL);

  • Ajouter une clé primaire (Primary Key) sur la colonne ID
    ALTER TABLE MYTABLE ADD (
      CONSTRAINT NAME_PK PRIMARY KEY (ID)
    );

  • Créer une séquence
    CREATE SEQUENCE NAME_SEQ ; 
    https://docs.oracle.com/cd/B14117_01/server.101/b10759/statements_6014.htm
    Une séquence permet d'avoir une suite de nombre entier. On crée un nom de séquence et on la manipule avec des pseudo colonnes comme CURRVAL ou NEXTVAL.

  • Configurer le déclencheur (Trigger)
    CREATE OR REPLACE 
      TRIGGER TRIGGER_TABLE 
      BEFORE INSERT ON MYTABLE 
      FOR EACH ROW BEGIN 
        IF :new.ID IS NULL THEN :new.ID := NAME_SEQ.NEXTVAL; 
        END IF; 
      END;
    https://docs.oracle.com/database/121/LNPLS/create_trigger.htm#LNPLS01374
    Un trigger permet d'exécuter le code que nous venons de déclarer
    FOR EACH ROW BEGIN IF :new.ID IS NULL THEN :new.ID := NAME_SEQ.NEXTVAL; END IF; END;
    lorsque qu'un évènement se produit
    TRIGGER TRIGGER_TABLE BEFORE INSERT ON MYTABLE

Et hop le tour est joué, pas besoin de préciser l'ID
INSERT INTO MYTABLE('Test')
>+ -----------+
 | ID   NAME  |
 |------------|
 |  1   Test  |
 + -----------+
blog comments powered by Disqus