Duplicata possible :
Pourquoi Oracle 9i traite-t-il une chaîne vide comme NULL ?
J'ai une table dans Oracle 10g nommée TEMP_TABLE
avec seulement deux colonnes - id
y description
juste pour le plaisir de la démonstration.
La colonne id
est une clé primaire générée par séquence de type NUMBER(35, 0) not null
et la colonne DESCRIPTION
est un type de VARCHAR2(4000) not null
.
La structure de base de la table dans ce cas ressemblerait à ce qui suit.
+--------------+-----------+---------------+
|Name | Null? | Type |
+--------------+-----------+---------------+
|ID | NOT NULL | NUMBER(35) |
|DESCRIPTION | NOT NULL | VARCHAR2(4000)|
+--------------+-----------+---------------+
Après avoir créé ce tableau, j'essaie d'insérer ce qui suit INSERT
alternativement.
INSERT INTO temp_table (id, description) VALUES (1, null); ->unsuccessful
INSERT INTO temp_table (id, description) VALUES (2, ''); ->unsuccessful
Tous deux échouent de manière évidente parce que la not null
est appliquée sur le DESCRIPTION
colonne.
Dans les deux cas, Oracle se plaint
ORA-01400: cannot insert NULL into ("WAGAFASHIONDB"."TEMP_TABLE"."DESCRIPTION")
Une chaîne vide est traitée comme un NULL
dans Oracle.
Si j'ai laissé tomber le not null
contrainte sur le DESCRIPTION
la structure de base de la table serait la suivante
+--------------+-----------+---------------+
|Name | Null? | Type |
+--------------+-----------+---------------+
|ID | NOT NULL | NUMBER(35) |
|DESCRIPTION | | VARCHAR2(4000)|
+--------------+-----------+---------------+
et les deux INSERT
telles qu'elles ont été spécifiées ont réussi. Elles créent deux lignes, l'une avec un null
et une autre avec une chaîne vide ''
dans le DESCRIPTION
de la colonne TEMP_TABLE
.
Maintenant, si je fais ce qui suit SELECT
commandement,
SELECT * FROM temp_table WHERE description IS NULL;
alors il récupère les deux lignes dans lesquelles il y a une null
et l'autre a une chaîne vide ''
dans le DESCRIPTION
colonne.
Les éléments suivants SELECT
ne récupère cependant aucune ligne de la base de données TEMP_TABLE
SELECT * FROM temp_table WHERE description='';
Il ne récupère même pas la ligne qui contient une chaîne vide dans le champ DESCRIPTION
colonne.
Vraisemblablement, il semble qu'Oracle traite une null
et une chaîne vide ''
différemment ici, ce qui ne semble cependant pas être le cas avec la INSERT
dans laquelle à la fois un null
et une chaîne vide ''
ne peuvent pas être insérés dans une colonne avec une valeur not null
contrainte. Pourquoi en est-il ainsi ?