天天看點

ORACLE之莫名---ORA-02290: 違反檢查限制條件

最近碰到一個十分棘手的問題,Java程式插入空資料到oracle時報ORA-02290: 違反檢查限制條件(NAMIBIAWEB.SYS_C0069731),【ORA-02290: check constraint (NAMIBIAWEB.SYS_C0069731) violated】這明顯是在設定不可為空的字段上插入為空内容導緻,但是檢查資料庫表後發現,字段設定為可為空,又檢視了建表語句發現該字段依然是可以為空,同時有一個奇怪的現象,報錯資訊中的SYS_C0069731在資料庫表中查詢不到資訊。

  針對這一莫名問題的報錯,我開始檢視程式中關于資料庫插入處是否存在字段非空限制的内容,結果并未發現任何限制資訊。

  我使用SQL語句直接在資料庫中插入空資料,報錯資訊為ORA-xxx:check xxxx,這裡捕捉到一個關鍵資訊check,check限制也是oracle資料庫中的一種限制條件,對于oracle資料庫來說限制有五種類型: 1、主鍵限制( Primary key, 簡稱 PK) 、 2、非空限制( not null , 簡稱 NN ) 、 3、唯一限制( Unique , 簡稱 UK ) 、4、檢查限制( Check , 簡稱 CK ) 、 5、外鍵( Foreign key, 簡稱 FK ),此處出現的check屬于其中。

  解決方法:

  首先要确定限制在哪一字段上,使用sql:select * from user_constraints where table_name='TABLENAME',(這裡要注意TABELNAME必須是大寫,表示業務表名稱),這樣資料表所有的限制都會呈現出來,如圖

ORACLE之莫名---ORA-02290: 違反檢查限制條件

 紅框中即為該報錯對應的限制條件

       找到報錯中SYS_C00105792限制條件,若本sql确能查詢出該SYS_C00105792,删除該check限制問題也就可以解決,檢視search_condition字段可以确定該限制使用在哪個字段上。

  删除check語句:ALTER TABLE TABLENAME DROP CONSTRAINT SYS_C0069731。【注:這裡不需要使用引号】

PS:如侵權,請告知,我删除