2012-03-13 42 views
1

我想通過應用程序插入一些值在表中,並得到問題ORA-00001:違反唯一約束。 我看到序列與表的最高ID不同步,但即使在修復序列號後,錯誤仍然存​​在。 我怎樣才能更多地調試這個錯誤,oracle日誌會給出更多錯誤?我怎樣才能看到oracle日誌? 感謝 Priyank問題ORA-00001:違反唯一約束進來INSERT/UPDATE

更新:我們正在使用的審計日誌插件,並在域類的用戶,我們趕上保存事件和登錄用戶類進入審計日誌

所以我們做的事:

class User { 

//some attributes, constraints, mappings 

def onSave = { 
Graaudit aInstance = new Graaudit(); 
     aInstance.eventType= "GRA User Create" 
     aInstance.eventDescription = "GRA User Created" 
     aInstance.objectid = username 
     aInstance.objecttype = 'GRAUSER' 
     aInstance.user_id = RequestContextHolder.currentRequestAttributes().session.username 

      aInstance.withTransaction{ 
       aInstance.save() 
      } 
    } 

} 

當我們在onSave事件中沒有上述代碼時,用戶被成功創建。
我假設它與我們在aInstance上使用的hibernate事務相關,那是因爲保存而死亡或當前事務正在死亡。
如果我們不使用的交易,我們得到一個異常"org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here" 不知道如何解決這個問題.. 感謝

+0

序列是唯一約束還是其他? – thursdaysgeek 2012-03-13 17:58:33

回答

5

該錯誤消息將包括所違反的約束的名稱(可能有不止一個唯一約束在桌子上)。您可以使用約束名稱來標識的唯一約束

SELECT column_name, position 
    FROM all_cons_columns 
WHERE constraint_name = <<name of constraint from the error message>> 
    AND owner   = <<owner of the table>> 
    AND table_name  = <<name of the table>> 

宣佈一旦你知道什麼樣的列(或多個)受影響的列(S),你可以比較你試圖INSERT或數據UPDATE對已經在表中的數據進行判斷,以確定違反約束的原因。

+0

或者,您可以使用此查詢:'SELECT * FROM ALL_CONS_COLUMNS A JOIN ALL_CONSTRAINTS C ON A.CONSTRAINT_NAME = C.CONSTRAINT_NAME WHERE C.CONSTRAINT_NAME LIKE'%SYS_C0010988%';'。只需將最後的'CONSTRAINT_NAME':'SYS_C0010988'替換爲錯誤消息中的那個。 – Navigatron 2017-06-29 08:46:18

1

Oracle的錯誤信息應該稍微長一些。它通常如下所示:

ORA-00001: unique constraint (TABLE_UK1) violated 

圓括號中的名稱是constrait名稱。它告訴你違反了哪個約束。

+0

如果只是一個沒有括號中的名稱的點,該怎麼辦?例如:ORA-00001:違反了唯一約束(。) – user1872384 2015-07-30 06:13:47

1

此ORA錯誤是由於違反唯一約束而發生的。

ORA-00001:唯一約束(constraint_name命令)違反

這是因爲試圖執行已經創造了一個獨特的索引限制的領域重複值的INSERT或UPDATE語句引起的。

您可以通過更改約束來解決此問題以允許重複或刪除唯一約束,或者可以更改SQL以避免重複的插入。