Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Java PreparedStatement dan ON DUPLICATE KEY UPDATE:bagaimana saya tahu apakah baris dimasukkan atau diperbarui?

Perhatikan tabel pengujian MySQL berikut ini:

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 ;

dengan data sampel yang ada sebagai berikut:

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

Dengan pengaturan koneksi default compensateOnDuplicateKeyUpdateCounts=false (dijelaskan di sini ) kode Java berikut

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);
}

menghasilkan output konsol berikut

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

Sekarang jalankan kode yang sama lagi dengan nilai parameter

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

dan output konsolnya adalah

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

Ini menunjukkan bahwa .executeUpdate benar-benar dapat mengembalikan 2 jika indeks unik menyebabkan baris yang ada diperbarui. Jika Anda memerlukan bantuan lebih lanjut dengan sebenarnya . Anda kode uji maka Anda harus mengedit pertanyaan Anda untuk memasukkannya.

Sunting

Pengujian lebih lanjut mengungkapkan bahwa .executeUpdate akan mengembalikan 1 jika

  1. percobaan INSERT dibatalkan karena akan menghasilkan nilai kunci UNIK duplikat, dan
  2. perubahan ON DUPLICATE KEY UPDATE yang ditentukan tidak benar-benar mengubah nilai apa pun di baris yang ada .

Ini dapat dikonfirmasi dengan menjalankan kode pengujian di atas dua kali berturut-turut dengan nilai parameter yang sama persis. Perhatikan bahwa UPDATE ... id = LAST_INSERT_ID(id) "trick" memastikan bahwa id yang benar nilai dikembalikan.

Itu mungkin menjelaskan hasil tes OP jika satu-satunya nilai yang dimasukkan adalah nilai kunci UNIK.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. YEARWEEK() Contoh – MySQL

  2. menambahkan paket RMySQL ke R gagal (di Windows)?

  3. Hubungkan Java ke database MySQL

  4. Memasukkan beberapa baris di mysql

  5. Kesalahan MysQl:Nomor parameter tidak valid