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

Java PreparedStatement và TRÊN CẬP NHẬT KHÓA DUPLICATE:làm cách nào để biết liệu hàng đã được chèn hoặc cập nhật hay chưa?

Hãy xem xét bảng kiểm tra MySQL sau:

CREATE TABLE `customers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `email` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

với dữ liệu mẫu hiện có như sau:

id  name            email
--  --------------  ----------------
 1  Loblaw, Bob     [email protected]
 2  Thompson, Gord  [email protected]

Với cài đặt kết nối mặc định compensateOnDuplicateKeyUpdateCounts=false (được mô tả tại đây ) mã Java sau

PreparedStatement ps = dbConnection.prepareStatement(
        "INSERT INTO customers (name, email) " +
        "VALUES (?, ?) " +
        "ON DUPLICATE KEY UPDATE " +
            "name = VALUES(name), " +
            "id = LAST_INSERT_ID(id)");
ps.setString(1, "McMack, Mike");
ps.setString(2, "[email protected]");
int euReturnValue = ps.executeUpdate();
System.out.printf("executeUpdate returned %d%n", euReturnValue);
Statement s = dbConnection.createStatement();
ResultSet rs = s.executeQuery("SELECT LAST_INSERT_ID() AS n");
rs.next();
int affectedId = rs.getInt(1);
if (euReturnValue == 1) {
    System.out.printf("    => A new row was inserted: id=%d%n", affectedId);
}
else {
    System.out.printf("    => An existing row was updated: id=%d%n", affectedId);
}

tạo ra đầu ra bảng điều khiển sau

executeUpdate returned 1
    => A new row was inserted: id=3

Bây giờ hãy chạy lại mã tương tự với các giá trị tham số

ps.setString(1, "Loblaw, Robert");
ps.setString(2, "[email protected]");

và đầu ra bảng điều khiển là

executeUpdate returned 2
    => An existing row was updated: id=1

Điều này chứng tỏ rằng .executeUpdate thực sự có thể trả về 2 nếu chỉ mục duy nhất khiến một hàng hiện có được cập nhật. Nếu bạn cần hỗ trợ thêm về thực tế của bạn mã kiểm tra thì bạn nên chỉnh sửa câu hỏi của mình để đưa vào.

Chỉnh sửa

Thử nghiệm thêm cho thấy rằng .executeUpdate sẽ trả về 1 nếu

  1. cố gắng INSERT đã bị hủy bỏ vì nó sẽ dẫn đến một giá trị khóa UNIQUE trùng lặp,
  2. các thay đổi ONDATE KEY UPDATE TRÊN DUPLICATE được chỉ định không thực sự sửa đổi bất kỳ giá trị nào trong hàng hiện có .

Điều này có thể được xác nhận bằng cách chạy mã kiểm tra trên hai lần liên tiếp với các giá trị tham số giống hệt nhau. Lưu ý rằng UPDATE ... id = LAST_INSERT_ID(id) "trick" đảm bảo rằng id chính xác giá trị được trả về.

Điều đó có thể giải thích kết quả kiểm tra của OP nếu giá trị duy nhất được chèn là giá trị khóa UNIQUE.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách mã hóa (utf8mb4) bằng Python

  2. Điều gì xảy ra với đoạn mã này sử dụng phần mở rộng mysql để tìm nạp dữ liệu từ cơ sở dữ liệu trong PHP?

  3. Tôi nên lưu trữ chuỗi kết nối cơ sở dữ liệu ở đâu?

  4. Chèn vào mySQL một giá trị được mã hóa JSON với các ký tự đặc biệt không thành công

  5. Cảnh báo:mysql_fetch_array () mong đợi tham số 1 là tài nguyên [...]