如何在NOT NULL字段中存储NULL?

时间:2009-11-09 16:37:21

标签: oracle null constraints

我刚刚在测试数据库的NOT-NULL字段中遇到NULL值。他们怎么能到那儿?我知道可以使用NOVALIDATE子句更改NOT-NULL约束,但这会更改USER_OBJECTS中表的last_ddl_time。而且这个时间少于创建这些记录的日期。还有别的东西我可以忽略吗?或者那个人的手册当然可以吗?

如果表是相关的,则对表进行分区和索引组织。 Oracle版本是9.2

3 个答案:

答案 0 :(得分:4)

NOT NULL列条件与其他约束条件不同:您可以禁用NOT NULL约束,但如果使用NOVALIDATE重新启用约束,则不会将该列视为NOT NULL。让我们建立一个小例子:

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将不会将该列视为NOT NULLABLE:

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

所以,我会说如果你在一个NOT NULLABLE列中有NULL值(根据我的上一个查询)你有一个错误(联系支持?)

答案 1 :(得分:1)

检查约束是否被暂停/禁用

答案 2 :(得分:1)

你确定这些列真的是空的吗?换句话说:

SELECT field
  FROM your_table
 WHERE not_null_field IS NULL;

返回行?也许他们只是得到了不可显示的数据......

相关问题