
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.
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
- Lire le nom de colonne dans le message.
- Est-elle dans la liste du INSERT ? sinon l’ajouter.
- La valeur fournie est-elle NULL (bind/paramètre/sous-requête vide) ?
- Faut-il un
DEFAULT, unNVL, 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.
