Tôi đang cố chèn một hàng có thể có hoặc chưa tồn tại. Tôi muốn tránh chọn nó trước và/hoặc nhận được -803 nếu nó tồn tại. Tôi đã thực hiện một số nghiên cứu và đã thử cả hai bỏ qua và tuyên bố hợp nhất, nhưng tiếp tục nhận được lỗi cú pháp trên cả hai. Trong mọi trường hợp, tôi không cố gắng sao chép dữ liệu từ một bảng khác - vì vậy, hợp nhất không thực sự thích hợp.
Không có cách nào trong SQL DB2 chỉ phát hành một chèn không bị lỗi và không phải mã hóa xung quanh điều này? Nói cách khác, có một số cú pháp chèn đảm bảo dữ liệu sẽ được thêm vào nếu nó không tồn tại hoặc sẽ trả lại trạng thái bằng không ngay cả khi nó không?Cố gắng tránh -803 trong DB2 chèn
Trả lời
Tóm lại, câu trả lời là không. Trong thời gian dài, tất cả phụ thuộc vào các ràng buộc bạn đã thiết lập trên bảng của bạn. Nếu bạn cố gắng thực hiện một chèn vào một bảng có ràng buộc duy nhất trên một cột và dữ liệu đã tồn tại mà bạn đang cố chèn, bạn sẽ gặp lỗi trong DB2 (và bất kỳ RDBMS nào khác).
Trong trường hợp này, tùy chọn tốt nhất của bạn có thể là viết một thủ tục lưu sẵn để kiểm tra xem bản ghi đã tồn tại chưa trước khi tạo.
MERGE là thích hợp, vì bạn có thể cung cấp động giá trị trong mệnh đề USING (xem ví dụ 5 trong http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.admin.doc/doc/r0010873.htm).
Nhưng MERGE là một tính năng V8.2 của DB2! Có thể bạn đang sử dụng V8.1, phải không?
Nếu bạn thực hiện việc kiểm tra sự tồn tại như thế này:
SELECT
if (found) UPDATE else INSERT
hãy cẩn thận các vấn đề đồng thời: Hai chủ đề đồng thời có thể cả hai tìm thấy không có cột và sau đó cả hai cố gắng chèn, thậm chí nếu có một giao dịch xung quanh mã ở trên. Để đảm bảo điều này sẽ không xảy ra, bạn cần có khóa cập nhật với Đọc lặp lại trong câu lệnh SELECT ở trên sử dụng WITH RR USE AND KEEP UPDATE LOCKS
.
Các sự cố đồng thời vẫn là một vấn đề nếu bạn thực hiện 'INSERT', bắt' -803' và sau đó thực hiện 'UPDATE'? –
Bạn có thể thực hiện báo cáo cập nhật, nếu điều đó trả về 0 kết quả được cập nhật, sau đó thực hiện lệnh chèn.
Bạn có thể làm điều này bằng cách sử dụng bảng sysibm.sysdummy (hoặc tên tốt hơn là kép từ Oracle hoặc các phiên bản sau của DB2). Điều này sẽ làm việc rất tốt cho trường hợp bạn muốn chèn một hàng không tồn tại nhưng trả về 0 nếu nó tồn tại. AFAIK, bạn không thể cập nhật một hàng bằng cách sử dụng phương pháp này, bạn sẽ cần phải sử dụng hợp nhất cho điều đó.
Để thực hiện việc này, bạn sẽ cần một khóa chính hoặc duy nhất trên bàn của mình. Bạn chèn vào bảng, chọn tất cả các giá trị của bạn từ kép trong quá trình mà một hàng không tồn tại trong bảng của bạn khớp với chỉ mục chính hoặc duy nhất của bạn.
insert into table (column1, column2, column3, column4, column5)
select 'A', 'B', 'C', 'D', 'E' from dual where not exists (select * from table where column1 = 'A');
Tôi thấy điều này rất hữu ích cho các trường hợp tôi có nhiều quy trình chèn vào bảng và tôi không thể đảm bảo thứ tự của các phụ trang đó. Bạn có thể phát hiện xem chèn có thành công hay không bằng giá trị trả về, giá trị này sẽ là 1 nếu thành công hoặc 0 nếu không
- 1. Cố gắng tránh AppDomains
- 2. Chèn ngày vào db2
- 3. Tại sao Hibernate cố gắng xóa khi tôi cố gắng cập nhật/chèn?
- 4. pyqt: Cố gắng hiểu các chèn cho QAbstractDataModel và QTreeView
- 5. Nhận ClassCastException khi cố gắng chèn RelativeLayout dyanmically?
- 6. scala: làm thế nào để tránh mutables bên trong cố gắng bắt khối
- 7. Tại sao EF cố gắng để chèn NULL trong id-cột?
- 8. DB2 cách lấy id chèn cuối cùng từ một bảng
- 9. Cố gắng tránh gửi email khi địa chỉ email kết thúc bằng ".old"
- 10. Cách tránh sự cố createBitmap() trong android
- 11. MySQLSyntaxErrorException khi cố gắng thực hiện PreparedStatement
- 12. Capybara-webkit cố gắng mở example.com
- 13. Cố gắng hiểu về DependencyProperty
- 14. Chèn một hàng vào DB2 từ một lựa chọn phụ - lỗi NULL
- 15. DB2: Làm thế nào để nối chuỗi rỗng trong DB2?
- 16. hàng lấy trong DB2
- 17. Các sự cố khi cố gắng tạo hình học gradle
- 18. DB2 human readable lỗi formatter
- 19. ERRORCODE = -4461, SQLSTATE = 42815 trong DB2
- 20. Nhận các lỗi khóa ngoài theo chu kỳ khi cố gắng tạo tập lệnh chèn dữ liệu trong SQL 2008
- 21. Android: cố gắng hiểu android: layout_weight
- 22. Cố gắng liên kết tĩnh Boost
- 23. Cố gắng sử dụng lớp C# SpellCheck
- 24. Cố gắng tạo liên kết với NSTextField
- 25. Java: Tránh chèn trùng lặp trong mảng danh sách
- 26. Cố gắng mô phỏng sóng 1 chiều
- 27. Cố gắng thêm nhiều đồ thị D3
- 28. Zend_Search_Lucene cố gắng phân bổ 3503812093817007931 byte
- 29. cố gắng thay đổi chuỗi -> int
- 30. Cố gắng triển khai Dữ liệu.Để
Tốt hơn: Đừng lãng phí thời gian kiểm tra sự tồn tại, có quy trình lưu trữ chèn và chỉ xử lý lỗi -803 (SQL0803N). Thậm chí tốt hơn: Chỉ cần có ứng dụng kiểm tra mã trả về từ chèn và xử lý lỗi -803. –
Cảm ơn bạn đã phản hồi nhanh. Tôi đã hy vọng DB2 có một số tương đương với tham số "bỏ qua", nhưng không có may mắn như vậy. Mike –
Đã cố gắng xử lý -803 và thực hiện cập nhật, nhưng điều này để lại một dấu vết ngăn xếp trong nhật ký ngay cả khi quá trình tổng thể thành công, khiến người khác đặt câu hỏi.Vì vậy, tôi đang thay đổi mã để thực hiện kiểm tra sự tồn tại trước tiên. Cảm ơn tất cả những lời đề nghị. –