ORA-01400 « cannot insert NULL » : causes et solutions

ORA-01400 « cannot insert NULL » : pourquoi Oracle refuse une valeur NULL dans une colonne NOT NULL et comment corriger (DEFAULT, NVL…), avec exemples.

Illustration de l'erreur Oracle ORA-01400

ORA-01400 « cannot insert NULL into (…) » signifie que vous essayez d’insérer (ou de mettre à jour) une valeur NULL dans une colonne déclarée NOT NULL. Oracle vous donne le nom exact de la colonne fautive — voici comment l’interpréter et les bonnes solutions selon le contexte.

Publicité

Le message

ORA-01400: cannot insert NULL into ("MONSCHEMA"."CLIENTS"."EMAIL")
ORA-01400: impossible d'insérer NULL dans (...)

La colonne entre parenthèses (EMAIL) a une contrainte NOT NULL et vous tentez de la laisser vide.

Cause 1 — Colonne obligatoire absente du INSERT

-- ❌ EMAIL est NOT NULL mais n'est pas fournie
INSERT INTO clients (id, nom) VALUES (1, 'Durand');
-- ✅ fournir la colonne obligatoire
INSERT INTO clients (id, nom, email) VALUES (1, 'Durand', 'durand@mail.fr');

Vérifiez quelles colonnes sont obligatoires :

SELECT column_name, nullable FROM user_tab_columns WHERE table_name='CLIENTS';

Cause 2 — Une valeur fournie vaut NULL (variable/bind vide)

La colonne est bien dans le INSERT, mais la valeur passée est NULL (paramètre applicatif non renseigné, sous-requête qui ne ramène rien). Contrôlez la source de la valeur, ou fournissez un défaut :

INSERT INTO clients (id, nom, email)
VALUES (1, 'Durand', NVL(:p_email, 'inconnu@exemple.fr'));

Voir notre tutoriel NVL Oracle pour remplacer les valeurs NULL.

Cause 3 — Colonne NOT NULL sans valeur par défaut

Si « pas de valeur » est légitime, deux options propres :

-- a) donner une valeur par défaut à la colonne
ALTER TABLE clients MODIFY email DEFAULT 'inconnu@exemple.fr';

-- b) si la colonne ne devrait pas être obligatoire, lever la contrainte
ALTER TABLE clients MODIFY email NULL;

⚠️ Ne retirez la contrainte NOT NULL que si l’absence de valeur a un sens métier — sinon vous masquez un vrai problème de données.

Cause 4 — UPDATE qui met NULL dans une colonne obligatoire

-- ❌
UPDATE clients SET email = NULL WHERE id = 1;
-- ✅ mettre une vraie valeur
UPDATE clients SET email = 'nouveau@mail.fr' WHERE id = 1;

Cause 5 — INSERT … SELECT avec des NULL

Lors d’un chargement, la source contient des NULL pour une colonne obligatoire de la cible :

-- repérer les lignes problématiques AVANT d'insérer
SELECT * FROM staging_clients WHERE email IS NULL;

-- insérer en remplaçant les NULL
INSERT INTO clients (id, nom, email)
SELECT id, nom, NVL(email, 'inconnu@exemple.fr') FROM staging_clients;

Checklist de résolution

  1. Lire le nom de colonne dans le message.
  2. Est-elle dans la liste du INSERT ? sinon l’ajouter.
  3. La valeur fournie est-elle NULL (bind/paramètre/sous-requête vide) ?
  4. Faut-il un DEFAULT, un NVL, ou la colonne devrait-elle être nullable ?

FAQ

Comment voir toutes les colonnes NOT NULL d’une table ?

SELECT column_name FROM user_tab_columns WHERE table_name='CLIENTS' AND nullable='N';

Une chaîne vide  » est-elle considérée comme NULL ?

Oui, en Oracle '' équivaut à NULL — insérer une chaîne vide dans une colonne NOT NULL déclenche aussi ORA-01400.

Quelle différence avec ORA-01407 ?

ORA-01400 concerne un INSERT (ou UPDATE) qui met NULL ; ORA-01407 est l’équivalent spécifique d’un UPDATE vers NULL dans certains contextes. La cause et la solution sont les mêmes.

Publicité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Publicité