Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Hibernate @SQLInsert và trên khóa trùng lặp

Câu trả lời đúng sẽ là sử dụng câu lệnh sau:

INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY 
UPDATE colB = VALUES(colB);

Tuy nhiên, vấn đề xuất hiện sau đó là chế độ ngủ đông không nhận được giá trị tự động tăng trở lại, sau khi câu lệnh cập nhật đã được thực hiện.

Tôi đã tìm thấy bài đăng trên blog sau ( http://www.jroller.com/mmatthews/entry/ get_hibernate_and_mysql_s ) và sửa đổi truy vấn thành như sau:

INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY 
UPDATE colB = VALUES(colB), id = LAST_INSERT_ID(id);

mà cuối cùng cũng hoạt động.

Một vấn đề nan giải với cách tiếp cận này là việc chèn hai thực thể bằng nhau trong cùng một giao dịch sẽ không hoạt động. Ngay cả khi lần chèn thứ hai sẽ gây ra cập nhật chính xác, thì kết thúc là 2 phiên bản thực thể đại diện cho cùng một hàng cơ sở dữ liệu - điều này không được phép.

Để giải quyết vấn đề này, người ta chỉ cần đảm bảo rằng bạn không chèn 2 thực thể được hiển thị bằng nhau do các ràng buộc của chúng. (Tôi đã sử dụng cùng một logic cho bằng / mã băm như ràng buộc khóa tổng hợp-duy nhất, vì vậy tôi có thể loại bỏ các bản sao như vậy khi thực hiện chèn hàng loạt)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xóa tất cả các hàng cũ hơn 5 ngày

  2. Cách tính toán sự khác biệt giữa hai dấu thời gian trong MySQL

  3. Tính tổng, trừ và kết hợp của nhiều cột trong bảng mysql

  4. trường varchar đặt hàng mysql dưới dạng số nguyên

  5. Việc thay đổi múi giờ MySQL có làm thay đổi giá trị của các trường DateTime trong cơ sở dữ liệu không?