Как я могу хранить NULL в поле NOT NULL? - PullRequest
3 голосов
/ 09 ноября 2009

Я только что натолкнулся на значения NULL в полях NOT-NULL в нашей тестовой базе данных.Как они могли туда добраться?Я знаю, что ограничения NOT-NULL можно изменить с помощью предложения NOVALIDATE, но это изменит таблицу last_ddl_time в USER_OBJECTSИ это время меньше, чем дата создания этих записей.Есть ли что-то еще, что я пропускаю?Или это чья-то ручная работа наверняка?

Таблица разбита на разделы и организована по индексу, если это уместно.Версия Oracle 9.2

Ответы [ 3 ]

4 голосов
/ 09 ноября 2009

Условие столбца NOT NULL не похоже на другие ограничения: вы можете отключить ограничение NOT NULL, но столбец не будет считаться NOT NULL, если вы повторно включите ограничение с помощью NOVALIDATE. Давайте создадим небольшой пример:

SQL> CREATE TABLE tt (ID NUMBER NOT NULL);

Table created

SQL> SELECT column_name, nullable FROM user_tab_columns WHERE table_name = 'TT';

COLUMN_NAME                    NULLABLE
------------------------------ --------
ID                             N

Теперь, если я отключу ограничение и снова включу его с помощью NOVALIDATE, столбец не будет считаться НЕ УСТРАНЕННЫМ Oracle:

SQL> SELECT constraint_name, search_condition
  2    FROM user_constraints WHERE table_name = 'TT';

CONSTRAINT_NAME                SEARCH_CONDITION
------------------------------ ----------------------------
SYS_C00786538                  "ID" IS NOT NULL

SQL> ALTER TABLE tt MODIFY CONSTRAINT SYS_C00786538 DISABLE;

Table altered

SQL> ALTER TABLE tt MODIFY CONSTRAINT SYS_C00786538 ENABLE NOVALIDATE;

Table altered

SQL> SELECT column_name, nullable FROM user_tab_columns WHERE table_name = 'TT';

COLUMN_NAME                    NULLABLE
------------------------------ --------
ID                             Y

Итак, я бы сказал, что если у вас есть значения NULL в столбце NOT NULLABLE (согласно моему последнему запросу), у вас есть ошибка (обратитесь в службу поддержки?)

1 голос
/ 09 ноября 2009

И вы уверены, что эти столбцы действительно нулевые? Другими словами:

SELECT field
  FROM your_table
 WHERE not_null_field IS NULL;

возвращает строки? Возможно, они только что получили не отображаемые данные ...

1 голос
/ 09 ноября 2009

Проверьте, приостановлено ли ограничение / отключено

...