Возможный дубликат:
Почему Oracle 9i обрабатывает пустую строку как NULL?
У меня есть таблица в Oracle 10g с именем TEMP_TABLE с двумя столбцами - id и description только для демонстрации.
Столбец id представляет собой первичный ключ сгенерированный последовательностью типа NUMBER(35, 0) not null, а столбец description является типом VARCHAR2(4000) not null.
Основная структура таблицы в этом случае будет выглядеть примерно так:
+--------------+-----------+---------------+
|Name | Null? | Type |
+--------------+-----------+---------------+
|ID | NOT NULL | NUMBER(35) |
|DESCRIPTION | NOT NULL | VARCHAR2(4000)|
+--------------+-----------+---------------+
После создания этой таблицы я пытаюсь вставить следующие команды INSERT.
INSERT INTO temp_table (id, description) VALUES (1, null); ->unsuccessful
INSERT INTO temp_table (id, description) VALUES (2, ''); ->unsuccessful
Оба они безуспешны как очевидные, потому что ограничение not null применяется в столбце description.
В обоих случаях Oracle жалуется
ORA-01400: cannot insert NULL into ("WAGAFASHIONDB"."TEMP_TABLE"."DESCRIPTION")
Пустая строка рассматривается как значение NULL в Oracle.
Если я опустил ограничение not null в столбце description, тогда основная структура таблицы выглядела бы следующим образом
+--------------+-----------+---------------+
|Name | Null? | Type |
+--------------+-----------+---------------+
|ID | NOT NULL | NUMBER(35) |
|DESCRIPTION | | VARCHAR2(4000)|
+--------------+-----------+---------------+
и обе команды INSERT, как указано, будут успешными. Они создавали бы две строки с параметром NULL, а другую с пустой строкой '' в столбце description TEMP_TABLE.
Теперь, если я выдаю следующую команду SELECT,
SELECT * FROM temp_table WHERE description IS NULL;
то он выбирает строки, в которых есть значение NULL, а другое имеет пустую строку '' в столбце description.
Следующий оператор SELECT, однако, не извлекает строки из TEMP_TABLE
SELECT * FROM temp_table WHERE description='';
Он даже не извлекает строку с пустой строкой в столбце description.
Предположительно, похоже, что Oracle рассматривает значение NULL и пустую строку '' по-другому здесь, но, как представляется, это не так с оператором INSERT, в котором значение a NULL и пустая строка '' не может быть вставлена в столбец с ограничением not null. Почему это так?