2009-11-09 31 views
3

我剛剛在我們的測試數據庫的NOT NULL字段中遇到NULL值。他們怎麼能到那裏?我知道NOT-NULL約束可以用NOVALIDATE子句改變,但是這會改變USER_OBJECTS中表的last_ddl_time。那個時間少於這些記錄創建的日期。還有什麼我可以忽略的嗎?或者是某人的手工工作肯定?如何將NULL存儲在NOT NULL字段中?

表是分區和索引組織的,如果這是相關的。 Oracle版本是9.2

回答

4

列條件與其他約束不同:可以禁用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(聯繫支持?)

+0

我將嘗試聚集足夠多的正式細節和聯繫支持。謝謝! – jva 2009-11-09 17:05:16

1

檢查約束懸浮/禁用

+0

我不熟悉「暫停」約束。你的意思是「殘疾」嗎?約束不會被禁用。 – jva 2009-11-09 16:45:40

1

你確定這些列真空?換句話說:

SELECT field 
    FROM your_table 
WHERE not_null_field IS NULL; 

返回行?也許他們剛剛得到了不可顯示的數據...

+0

好主意,但它返回數據。 :(我也嘗試禁用和啓用那些NOT NULL約束,並且它無法驗證。 – jva 2009-11-09 16:51:55