Ошибка при передаче значения Null в столбец NOT NULLABLE таблицы Oracle с установленным DATA_DEFAULT - Entity Framework - PullRequest
0 голосов
/ 24 января 2020

Столбец в Oracle БД - таблица имеет NULLABLE = NO и DATA_DEFAULT = 'T'

Используя EntifyFramework, когда я пытаюсь передать NULL (это строковое свойство для объекта, где NULL это значение по умолчанию) в этом поле, я ожидаю, что он вставит букву «Т» в этот столбец, но вместо этого он выдаст ошибку.

"The COL_NAME field is required."

1 Ответ

0 голосов
/ 24 января 2020

Это ожидаемое поведение. Значение по умолчанию применяется, когда на этот столбец нет ссылки в операторе вставки. Когда вы ссылаетесь на столбец, вы переопределяете значение по умолчанию - будь то со значением 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 , поэтому, если вы все еще используете старую версию, вы не сможете ее использовать. Но если вы используете версию, которая поддерживает это, изменение определения таблицы позволит вашему явному нулю делать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...