mercredi 4 février 2009

Comportement du DEFAULT VALUE sur une colonne de table

Voici une petite particularité banale mais que plusieurs se font prendre au piège.

Supposons la table suivante :

CREATE TABLE test
(c1 VARCHAR2(10),
c2 NUMBER,
c3 DATE DEFAULT SYSDATE);

Saviez-vous qu’en exécutant un INSERT comme ci-dessous, la colonne C3 ne sera pas assignée à la valeur par défaut (SYSDATE):

INSERT INTO test(c1,c2,c3) VALUES ('b',2,NULL);

C'est normal car la colonne C3 est précisée ainsi que la valeur "NULL".

La même chose se produit lorsque la commande INSERT SELECT est utilisée si la valeur de la colonne correspondant à « C3 » est nulle dans la table « test2 »:

INSERT INTO test SELECT * FROM test2

Si l'on modifie la colonne pour qu'elle soit obligatoire et que nous exécutons une insertion comme celle précédemment, nous obtiendrons un erreur car nous forcons la valeur "NULL" :

ALTER TABLE test modify c3 NOT NULL;

INSERT INTO test(c1,c2,c3) VALUES ('c',3,NULL)
*ERROR at line 1:ORA-01400: cannot insert NULL into ("ERIC"."TEST"."C3")

Tandis que si nous enlevons la colonne C3 et la valeur "NULL" de la commande INSERT, l'insertion s'effectuera avec succès et la colonne sera affectée de la valeur par défaut :

INSERT INTO test(c1,c2) VALUES ('c',3);

Et ce, même si la colonne n'est pas obligatoire :

ALTER TABLE test modify c3 NULL;
INSERT INTO test(c1,c2) VALUES ('d',4);

Aucun commentaire:

Publier un commentaire