2012-07-26 76 views
1

我們最近從Oracle 9.2版遷移到11g。 但是,使用數據庫的應用程序出現了一些錯誤。我們得到以下異常:Oracle 9.2遷移到11g - 默認值

ORA-01400: cannot insert null into... 

我看了有關的錯誤,特別是關於版本11克一些新的功能,可能是原因的信息。

而我在這裏。我知道使用默認值定義表列的舊方法無法工作,但我不知道爲什麼,更重要的是如何解決問題。

這裏的表,我可以看到使用SQL Developer的定義:

COLUMN_NAME   DATA_TYPE  NULLABLE  DATA_DEFAULT COLUMN_ID 
-------------------------------------------------------------------------- 
... 
REP_DOC_RECEIVED CHAR(1 BYTE) No   'n'   12 
... 

當我嘗試插入一行與該列空值時,會拋出異常。

+0

該列說可空:不,這可能是爲什麼你不能在這個列中插入一個空值......默認值不是自動的,你仍然需要填充值。什麼也沒有變。在中添加觸發器,或者只是不指定該列。 – Ben 2012-07-26 15:41:15

+0

@Ben:我不這麼認爲:*默認值不是自動的,您仍然需要填充值。*,實際上是相反的,請參閱我的答案。 – GWu 2012-07-27 05:22:51

+0

@gwu,也許措辭不佳...... – Ben 2012-07-27 11:23:14

回答

1

僅當插入語句中提供了值時,纔會應用默認值。所以我想你的插入使得一些insert into ... values (... , NULL, ...)

見例如http://sqlfiddle.com/#!4/cd58c/7以示區別:

-- ok 
insert into a (n,REP_DOC_RECEIVED) values (1,'A'); 

-- ok, default is applied  
insert into a (n) values (1); 

-- not ok, NOT NULL constraint violated  
insert into a (n,REP_DOC_RECEIVED) values (1,''); 

你要做的要麼NVL(...,'n')在INSERT語句或留出列。不,這在11g中沒有改變。

+0

感謝您的演示。 遷移是我的第一個想法,但真正的問題是我們的數據庫需要唯一的列名稱,並且我添加了一些列名稱已經存在於其他表中=> bug。但是我不知道爲什麼數據庫需要唯一的列名稱,但這是另一個問題。 – Goulutor 2012-07-27 11:44:55