Возможный дубликат:
Почему 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
. Почему это так?