我刚刚在测试数据库的NOT-NULL字段中遇到NULL值。他们怎么能到那儿?我知道可以使用NOVALIDATE子句更改NOT-NULL约束,但这会更改USER_OBJECTS中表的last_ddl_time。而且这个时间少于创建这些记录的日期。还有别的东西我可以忽略吗?或者那个人的手册当然可以吗?
如果表是相关的,则对表进行分区和索引组织。 Oracle版本是9.2
答案 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;
返回行?也许他们只是得到了不可显示的数据......