Jusqu'à la version 11gR2, la clause "DEFAULT" dans la définition d'une colonne ne prenait pas les séquences et s'appliquait uniquement lorsqu'on ne précisait pas de valeur.
La version 12c introduit deux nouveautés :
En version 12c, une colonne peut avoir une valeur par défaut qui est une séquence.
En version 12c, une valeur insérée à NULL peut voir sa valeur changée grace à la nouvelle clause "DEFAULT ON NULL". Cette clause comprend le fonctionnement par défaut (valeur attribuée si colonne omise) et traite en plus les valeurs insérées à NULL.
CREATA TABLE table_name ( ... column_name datatype DEFAULT [ ON NULL ] expr | seq_name.NEXTVAL ... );
--
-- Creation de la table
--
CREATE SEQUENCE SEQ_TEST;
CREATE TABLE TEST (
ID NUMBER,
COL1 VARCHAR2(30),
COL2 VARCHAR2(30) DEFAULT 'DEF',
COL3 VARCHAR2(30) DEFAULT ON NULL 'DEF_ON_NULL',
COL4 NUMBER DEFAULT SEQ_TEST.NEXTVAL
);
desc TEST
Nom NULL Type
---- -------- ------------
ID NUMBER
COL1 VARCHAR2(30)
COL2 VARCHAR2(30)
COL3 NOT NULL VARCHAR2(30)
COL4 NUMBER
-- On note au passage la création implicite d'une contrainte NOT NULL
-- (plus précisément CHECK "COL3" IS NOT NULL) lorsque l'on utilise "DEFAULT ON NULL".
--
-- Insertion des données
--
INSERT INTO TEST (ID) VALUES (1);
1 lignes inséré.
INSERT INTO TEST (ID, COL1, COL2, COL3, COL4) VALUES (2, 'VAL', 'VAL', 'VAL', 99);
1 lignes inséré.
INSERT INTO TEST (ID, COL1, COL2, COL3, COL4) VALUES (3, NULL, NULL, NULL, NULL);
1 lignes inséré.
--
-- Vérification
--
SELECT * FROM TEST ORDER BY ID;
ID COL1 COL2 COL3 COL4
---------- -------------------- -------------------- -------------------- ----------
1 DEF DEF_ON_NULL 1
2 VAL VAL VAL 99
3 DEF_ON_NULL
-- On constate bien que :
-- La colonne DEFAULT ON NULL insere bien DEF_ON_NULL lorsque la colonne est omise
-- La colonne DEFAULT ON NULL insere bien DEF_ON_NULL lorsque l'on insere NULL explicitement