最近碰到一個十分棘手的問題,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必須是大寫,表示業務表名稱),這樣數據表所有的約束都會呈現出來,如圖
紅框中即為該報錯對應的約束條件
找到報錯中SYS_C00105792約束條件,若本sql確能查詢出該SYS_C00105792,刪除該check約束問題也就可以解決,查看search_condition字段可以確定該約束使用在哪個字段上。
刪除check語句:ALTER TABLE TABLENAME DROP CONSTRAINT SYS_C0069731。【注:這里不需要使用引號】
