Oracle 9.2 перенесен на 11g — значения по умолчанию

Недавно мы перешли с Oracle версии 9.2 на 11g. Но появились некоторые баги с приложением, использующим базу данных. Получаем следующее исключение:

ORA-01400: cannot insert null into...

Я искал информацию об ошибке и особенно о некоторых новых функциях в версии 11g, которые могли быть причиной.

И вот я. Я знаю, что старый способ определения столбцов таблицы со значениями по умолчанию не может работать, но я не знаю, почему и, что более важно, как решить проблему.

Вот определение таблицы, которую я вижу с помощью SQL Developer:

COLUMN_NAME         DATA_TYPE       NULLABLE      DATA_DEFAULT   COLUMN_ID
--------------------------------------------------------------------------
...
REP_DOC_RECEIVED    CHAR(1 BYTE)    No            'n'            12 
...

Когда я пытаюсь вставить строку с нулевым значением для этого столбца, возникает исключение.


person Goulutor    schedule 26.07.2012    source источник
comment
В столбце написано nullable: no, возможно, поэтому вы не можете вставить null в этот столбец... Значение по умолчанию не является автоматическим, вам все равно нужно заполнить значение. Ничего не изменилось. Добавьте триггер или просто не указывайте этот столбец.   -  person Ben    schedule 26.07.2012
comment
@Ben: Я так не думаю: Значение по умолчанию не является автоматическим, вам все равно нужно заполнить значение. На самом деле все наоборот, см. Мой ответ.   -  person GWu    schedule 27.07.2012
comment
@gwu, возможно, плохо сформулировано ...   -  person Ben    schedule 27.07.2012


Ответы (1)


Значение по умолчанию применяется только в том случае, если в операторе вставки указано значение нет. Так что я думаю, что ваша вставка делает некоторые insert into ... values ( ... , NULL, ...).

См., например, http://sqlfiddle.com/#!4/cd58c/7, чтобы показать разницу:

-- ok
insert into a (n,REP_DOC_RECEIVED) values (1,'A');

-- ok, default is applied    
insert into a (n) values (1);

-- not ok, NOT NULL constraint violated    
insert into a (n,REP_DOC_RECEIVED) values (1,'');

Вы должны сделать либо NVL(...,'n') в операторе вставки, либо пропустить столбец. И нет, это не изменилось в 11g.

person GWu    schedule 27.07.2012
comment
Спасибо за демонстрацию. Миграция была моей первой идеей, но реальная проблема заключалась в том, что нашей базе данных нужны уникальные имена столбцов, и я добавил несколько таблиц с именами столбцов, уже существующими в других таблицах => ошибка. Однако я не знаю, зачем БД нужны уникальные имена столбцов, но это другой вопрос. - person Goulutor; 27.07.2012