我需要運行一個違反唯一約束的Oracle查詢,只在不違反約束的記錄上。在MySQL中,我相信這可以使用ignore命令完成。在Oracle中是否有相當於?甲骨文相當於MySQL更新忽略
回答
您可以使用Oracle的錯誤記錄功能此:
首先,你需要創建一個將在後麪包含忽略行的表:
EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('YOUR_TABLE', 'YOUR_TABLE_ERROR_LOG');
,創建一個表稱爲YOUR_TABLE_ERROR_LOG
爲表命名YOUR_TABLE
(顯然你只需要這樣做一次)。
當你運行你的更新,你需要添加LOG ERRORS
條款:
UPDATE your_table
SET ...
WHERE ...
LOG ERRORS INTO YOUR_TABLE_ERROR_LOG ('UPDATE running at '||to_char(sysdate, 'yyyy-MM-dd HH24:MI:SS'))
REJECT LIMIT UNLIMITED;
被指定是幫助你找出產生錯誤動作的任意值的字符串。
更新後,您可以查詢表YOUR_TABLE_ERROR_LOG以查看發生了哪些錯誤和原因。如果您對這些錯誤不感興趣,那麼只需稍後截斷錯誤日誌表即可。
欲瞭解更多詳細信息,請參閱手冊:
http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_10008.htm#BCEFBFCD
編輯 2014年10月27日
由於Oracle 11.2有一個名爲CHANGE_DUPKEY_ERROR_INDEX
新的提示,可用於這一目的。我從來沒有嘗試過這一點。
詳細的手冊: http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements006.htm#CHDIFFJE
對於INSERT
操作有一個名爲IGNORE_ROW_ON_DUPKEY_INDEX
類似的提示:
http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements006.htm#CHDEGDDG
一些例子:
很難明確地說「不」(Oracle很大),但在15年的數據庫編程中,我從來沒有在Oracle中看到過這樣的功能。您可以禁用約束,但這與您在此嘗試完成的不同。
一種解決方法是編寫一些PL/SQL來處理您逐行更新的表,嘗試進行更新併吞下任何錯誤。這不會有效,但它會起作用。但是在我能想象的每種場景中(除非你有一個非常非常複雜的表),你應該可以編寫更新查詢以包含適合約束的適當子查詢。確切的策略將取決於表格和查詢。
- 1. 相當於甲骨文
- 2. SQL服務器相當於加入甲骨文更新
- 3. 相當於甲骨文NTH_VALUE功能
- 4. 甲骨文相當於PostgreSQL的Hstore
- 5. 甲骨文 「LIMIT N,M」 相當於
- 6. 甲骨文DBMS_CRYPTO.DES_CBC_PKCS相當於在C#中
- 7. 甲骨文更新
- 8. 更新甲骨文
- 9. 分組在甲骨文忽略NULL
- 10. 甲骨文的聲明忽略錯誤
- 11. 甲骨文更新和當前的
- 12. 甲骨文更新鎖
- 13. 更新查詢甲骨文
- 14. 更新在甲骨文
- 15. 更新在甲骨文
- 16. 更新SQL與甲骨文
- 17. 甲骨文編號更新
- 18. 更新甲骨文聲明
- 19. 甲骨文:在更新
- 20. 甲骨文 - 複雜更新
- 21. SQL甲骨文更新
- 22. 甲骨文更新很慢
- 23. 相同的查詢,慢於甲骨文9,快於甲骨文10
- 24. 甲骨文相當於SQL函數 '轉換'
- 25. 甲骨文相當於SQL Server的快照隔離
- 26. 修改XML節點值 - 如updateXML相當於甲骨文12C
- 27. 甲骨文解碼功能相當於在SQL服務器2005+
- 28. 甲骨文相當於CROSS的適用VALUES
- 29. 甲骨文更新序列值
- 30. 有條件更新甲骨文UPSERT