Giải pháp duy nhất được hỗ trợ bởi cả MySQL và HSQLDB là truy vấn các hàng bạn định thay thế và có điều kiện là CHÈN hoặc CẬP NHẬT. Điều này có nghĩa là bạn phải viết nhiều mã ứng dụng hơn để bù đắp cho sự khác biệt giữa các triển khai RDBMS.
- BẮT ĐẦU GIAO DỊCH.
- CHỌN ... ĐỂ CẬP NHẬT.
- Nếu CHỌN tìm thấy các hàng, thì CẬP NHẬT.
- Khác, INSERT.
- CAM KẾT.
MySQL không hỗ trợ câu lệnh ANSI SQL MERGE. Nó hỗ trợ REPLACE và INSERT ... ON DUPLICATE KEY UPDATE. Xem câu trả lời của tôi cho " CHÈN BỎ QUA "so với" CHÈN ... TRÊN CẬP NHẬT KHÓA DUPLICATE " để biết thêm về điều đó.
Nhận xét lại:Có, một cách tiếp cận khác là chỉ cần thử INSERT và xem nó có thành công hay không. Nếu không, hãy CẬP NHẬT. Nếu bạn cố gắng INSERT và nó chạm vào một khóa trùng lặp, nó sẽ tạo ra lỗi, lỗi này sẽ biến thành một ngoại lệ trong một số giao diện máy khách. Nhược điểm của việc này trong MySQL là nó tạo ra một ID tăng tự động mới ngay cả khi INSERT không thành công. Vì vậy, bạn kết thúc với khoảng trống. Tôi biết khoảng trống trong trình tự tăng tự động thông thường không phải là điều đáng lo ngại, nhưng tôi đã giúp một khách hàng có khoảng cách giữa các lần chèn thành công là 1000-1500 vì hiệu ứng này và kết quả là họ đã sử dụng hết phạm vi của một INT trong khóa chính của họ.
Như @baraky nói, thay vào đó, người ta có thể thử CẬP NHẬT trước và nếu điều đó ảnh hưởng đến hàng không, thì hãy thực hiện CHÈN thay thế. Nhận xét của tôi về chiến lược này là CẬP NHẬT không hàng không phải là một ngoại lệ - bạn sẽ phải kiểm tra "số hàng bị ảnh hưởng" sau khi CẬP NHẬT để biết liệu nó có "thành công" hay không.
Nhưng việc truy vấn số hàng bị ảnh hưởng sẽ đưa bạn trở lại vấn đề ban đầu:bạn phải sử dụng các truy vấn khác nhau trong MySQL so với HSQLDB.
HSQLDB:
CALL DIAGNOSTICS(ROW_COUNT);
MySQL:
SELECT ROW_COUNT();