Это ожидаемое поведение. Значение по умолчанию применяется, когда на этот столбец нет ссылки в операторе вставки. Когда вы ссылаетесь на столбец, вы переопределяете значение по умолчанию - будь то со значением NULL или другим не ненулевым значением.
Из документации для insert
:
Если вы опустите один или несколько столбцов таблицы из этого списка, то значение столбца этого столбца для вставленной строки будет значением столбца по умолчанию, которое указывалось при создании или последнем изменении таблицы. Если какой-либо пропущенный столбец имеет ограничение NOT NULL и значение по умолчанию отсутствует, база данных возвращает ошибку, указывающую, что ограничение было нарушено, и откатывает оператор INSERT
. Обратитесь к CREATE TABLE
для получения дополнительной информации о значениях столбца по умолчанию.
Таким образом, вы должны опустить столбец, чтобы выбрать значение по умолчанию.
Значение по умолчанию не означает «заменить ноль на это»; это означает «использовать, если не установлен вообще». Значение null не равно значению.
Имейте в виду, что если бы это было не так, если бы у вас был обнуляемый столбец со значением по умолчанию, было бы невозможно явно установить для него значение null. при вставке.
Однако вы можете переопределить это, по крайней мере в более поздних версиях, как указано в документации create table
:
DEFAULT
Предложение DEFAULT
позволяет указать значение, которое будет присвоено столбцу, если последующий оператор INSERT
пропустит значение для столбца.
...
ON NULL
Если указать условие ON NULL
, тогда Oracle База данных назначит значение столбца DEFAULT, когда последующий оператор INSERT
попытается присвоить значение, которое оценивается как NULL
.
При указании ON NULL
неявно указываются ограничение NOT NULL
и состояние ограничения NOT DEFERRABLE
. При указании встроенного ограничения, которое конфликтует с NOT NULL
и NOT DEFERRABLE
, возникает ошибка.
Быстрая демонстрация:
create table t42 (
id number,
col_a varchar2(1) default 'A' not null,
col_b varchar2 (1) default on null 'B'
);
Table T42 created.
insert into t42 (id) values (1);
1 row inserted.
-- this will fail - the scenario from the question
insert into t42 (id, col_a) values (2, null);
ORA-01400: cannot insert NULL into ("STACK"."T42"."COL_A")
insert into t42 (id, col_b) values (3, null);
1 row inserted.
insert into t42 (id, col_a, col_b) values (4, 'X', null);
1 row inserted.
insert into t42 (id, col_a, col_b) values (5, 'Y', 'Z');
1 row inserted.
select * from t42;
ID C C
---------- - -
1 A B
3 A B
4 X B
5 Y Z
Предложение on null
было добавлено в 12cR1 , поэтому, если вы все еще используете старую версию, вы не сможете ее использовать. Но если вы используете версию, которая поддерживает это, изменение определения таблицы позволит вашему явному нулю делать то, что вы хотите.