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
- 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, và
- 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.