我剛剛在我們的測試數據庫的NOT NULL字段中遇到NULL值。他們怎麼能到那裏?我知道NOT-NULL約束可以用NOVALIDATE子句改變,但是這會改變USER_OBJECTS中表的last_ddl_time。那個時間少於這些記錄創建的日期。還有什麼我可以忽略的嗎?或者是某人的手工工作肯定?如何將NULL存儲在NOT NULL字段中?
表是分區和索引組織的,如果這是相關的。 Oracle版本是9.2
我剛剛在我們的測試數據庫的NOT NULL字段中遇到NULL值。他們怎麼能到那裏?我知道NOT-NULL約束可以用NOVALIDATE子句改變,但是這會改變USER_OBJECTS中表的last_ddl_time。那個時間少於這些記錄創建的日期。還有什麼我可以忽略的嗎?或者是某人的手工工作肯定?如何將NULL存儲在NOT NULL字段中?
表是分區和索引組織的,如果這是相關的。 Oracle版本是9.2
列條件與其他約束不同:可以禁用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重新啓用,該列將不被甲骨文認爲不能爲空:
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值(按照我最後的查詢),你有一個bug(聯繫支持?)
你確定這些列真空?換句話說:
SELECT field
FROM your_table
WHERE not_null_field IS NULL;
返回行?也許他們剛剛得到了不可顯示的數據...
好主意,但它返回數據。 :(我也嘗試禁用和啓用那些NOT NULL約束,並且它無法驗證。 – jva 2009-11-09 16:51:55
我將嘗試聚集足夠多的正式細節和聯繫支持。謝謝! – jva 2009-11-09 17:05:16