SQL DUMP отсутствует информация в столбце

В базе данных A: я создаю test.dmp с помощью команды oracle sql exp.exe:

exp.exe %CONNECT% FILE=test.dmp LOG=%LOGFILE% DIRECT=Y STATISTICS=NONE

В файле.log он пишет:

. . export table TBL_TEST 7000 rows exported (no error!). 

Версия: Oracle Database 11g Enterprise Edition, выпуск 11.2.0.4.0 - 64-разрядная версия

В базе данных B: я импортирую test.dmp с помощью команды imp.exe:

imp.exe %CONNECT% file=test.dmp LOG=%LOGFILE% FULL=Y

В файле.log я вижу ошибку:

. . importing table TBL_TEST
IMP-00019: row rejected due to ORACLE error 1400
IMP-00003: ORACLE error 1400 encountered
ORA-01400: cannot insert NULL into (TBL_TEST.COLUMN_A)

Версия: Oracle Database 11g Enterprise Edition, выпуск 11.2.0.4.0 - 64-разрядная версия

TBL_TEST.COLUMN_A имеет тип NUMBER(1,0), Nullable= Нет, DATA_DEFAULT=0.

Как это может быть возможно? В базе данных A столбец "COLUMN_A" заполнен и также определен как не нулевой. Все таблицы воссозданы с нуля в базе данных B.

У вас есть идеи, почему это может произойти?

Заранее спасибо,

Луиза Брадуска

1 ответ

Решение

Это похоже на то, что рассматриваемый столбец был добавлен в существующую таблицу, в которой уже были данные. В предыдущих выпусках это могло быть довольно медленно. Если не указать значение по умолчанию, столбец будет добавлен, его значение будет установлено для всех существующих строк посредством обновления, и только тогда может быть добавлено ограничение not-null. При значении по умолчанию обновления будут происходить автоматически, но все равно будут занимать время.

В 11g Oracle устраняет эту проблему, когда вы указываете значение по умолчанию. Это делает добавление столбца практически мгновенным и прозрачным для запросов. Это объясняется в документации:

Если вы укажете условие DEFAULT для столбца NOT NULL, то значение по умолчанию будет сохранено как метаданные, но сам столбец не будет заполнен данными. Однако последующие запросы, которые указывают новый столбец, переписываются, так что значение по умолчанию возвращается в наборе результатов.

Наследие exp инструмент этого не понимает; он экспортирует значения в столбцах, которые будут нулевыми для старых строк.

Вам нужно использовать инструмент экспорта datapump, expdpвместо этого - это будет включать значение по умолчанию в выгруженных данных, поэтому оно будет правильно вставлено в таблицу базы данных B. И вам нужно тогда использовать impdp для импорта конечно.

Другие вопросы по тегам