Tôi cần chạy truy vấn Oracle có thể vi phạm các ràng buộc duy nhất, chỉ trên các bản ghi không vi phạm ràng buộc. Trong MySQL tôi tin rằng điều này có thể được thực hiện bằng cách sử dụng lệnh ignore. Có tương đương với Oracle không?Oracle tương đương với bản cập nhật MySQL bỏ qua
Trả lời
Bạn có thể sử dụng tính năng đăng nhập lỗi của Oracle cho việc này:
Trước tiên, bạn cần phải tạo ra một bảng mà sau này sẽ chứa các hàng bỏ qua:
EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('YOUR_TABLE', 'YOUR_TABLE_ERROR_LOG');
Điều đó tạo ra một bảng gọi là YOUR_TABLE_ERROR_LOG
cho bảng tên YOUR_TABLE
(rõ ràng bạn chỉ cần làm điều đó một lần).
Khi bạn chạy CẬP NHẬT của bạn, bạn cần phải thêm khoản 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;
Chuỗi được chỉ định là một giá trị tùy ý giúp bạn xác định các hành động đã tạo ra lỗi.
Sau khi cập nhật, bạn có thể truy vấn bảng YOUR_TABLE_ERROR_LOG để xem lỗi nào đã xảy ra và lý do. Nếu bạn không quan tâm đến các lỗi, chỉ cần cắt ngắn bảng nhật ký lỗi sau đó.
Để biết thêm thông tin chi tiết xem hướng dẫn:
http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_10008.htm#BCEFBFCD
Sửa 2014-10-27
Kể từ khi Oracle 11,2 có một gợi ý mới có tên CHANGE_DUPKEY_ERROR_INDEX
mà có thể được sử dụng cho mục đích này. Tôi chưa bao giờ thử điều này mặc dù.
chi tiết trong cuốn hướng dẫn: http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements006.htm#CHDIFFJE
Đối INSERT
hoạt động có một gợi ý tương tự tên IGNORE_ROW_ON_DUPKEY_INDEX
:
http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements006.htm#CHDEGDDG
Một số ví dụ:
Thật khó để dứt khoát nói không (Oracle là lớn) nhưng trong 15 năm lập trình cơ sở dữ liệu tôi chưa bao giờ thấy một tính năng như thế này trong Oracle. Bạn có thể vô hiệu hóa các ràng buộc, nhưng đó không phải là điều tương tự như bạn đang cố gắng thực hiện ở đây.
Một cách giải quyết khác là viết một số PL/SQL xử lý bảng mà bạn đang cập nhật từng hàng, cố gắng thực hiện cập nhật và nuốt bất kỳ lỗi nào. Điều đó sẽ không hiệu quả, nhưng nó sẽ hoạt động. Nhưng trong mọi kịch bản tôi có thể tưởng tượng (trừ khi bạn có một bảng rất, rất phức tạp), bạn sẽ có thể viết truy vấn cập nhật của mình để bao gồm các truy vấn phụ thích hợp làm việc xung quanh các ràng buộc. Chiến lược chính xác sẽ phụ thuộc vào các bảng và truy vấn.
- 1. MySQL tương đương với SEQUENCE.NEXTVAL Oracle
- 2. Oracle Tương đương với kiểu TEXT của MySQL
- 3. Tương đương với RowID của Oracle trong MySQL
- 4. LOAD DATA INFILE tương đương trong Oracle
- 5. phpMyAdmin tương đương với MySQL cho Redis?
- 6. Oracle 'printf' tương đương
- 7. Chọn N hàng đầu với "để cập nhật bỏ qua khóa" trong Oracle
- 8. Tương đương với Oracle của PostgreSQL INSERT ... RETURNING *;
- 9. Liên kết cơ sở dữ liệu Oracle - MySQL tương đương?
- 10. Oracle tương đương với SQL Server/Sybase DateDiff
- 11. Truy vấn cập nhật Oracle với chọn
- 12. mysql cập nhật với regexp
- 13. Maven Phiên bản Bỏ qua Bỏ qua Cập nhật Kiểm tra
- 14. Có MySQL tương đương với TIMESTAMP của Oracle với TIME ZONE không?
- 15. cập nhật với kết nối mysql?
- 16. Truy vấn MySQL tương đương với PHP strip_tags là gì?
- 17. Cập nhật MySQL với phụ chọn
- 18. MySQLi Tương đương với Mã MySQL
- 19. Python tương đương với IFNULL của MySQL
- 20. PostgreSQL tương đương với hàm PERCENTILE_CONT của Oracle
- 21. mysql chức năng để cung cấp tương đương với Oracle NVL
- 22. Có chức năng nào tương đương với chức năng Oracle NVL trong Mysql không?
- 23. MySQL "IS IN" tương đương?
- 24. Tương đương với REGEXP_SUBSTR trong mysql là gì?
- 25. PHP tương đương với nhật ký truy vấn chậm của MySQL?
- 26. Sql Server tương đương với Oracle CREATE OR REPLACE XEM
- 27. SQL Server tương đương với Oracle CONNECT BY và pseudocolumn
- 28. Oracle tương đương với DISTINCT của Postgres ON?
- 29. Có tương đương với sp_getapplock, sp_releaseapplock trong oracle
- 30. Có một Oracle tương đương với SQL Server's OUTPUT INSERTED. *?