Overvej følgende MySQL-testtabel:
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 ;
med eksisterende eksempeldata som følger:
id name email
-- -------------- ----------------
1 Loblaw, Bob bob@example.com
2 Thompson, Gord gord@example.com
Med standardforbindelsesindstillingen compensateOnDuplicateKeyUpdateCounts=false
(beskrevet her
) følgende Java-kode
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, "mike@example.com");
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);
}
producerer følgende konsoludgang
executeUpdate returned 1
=> A new row was inserted: id=3
Kør nu den samme kode igen med parameterværdierne
ps.setString(1, "Loblaw, Robert");
ps.setString(2, "bob@example.com");
og konsoludgangen er
executeUpdate returned 2
=> An existing row was updated: id=1
Dette viser, at .executeUpdate
virkelig kan returnere 2, hvis det unikke indeks får en eksisterende række til at blive opdateret. Hvis du har brug for yderligere hjælp til din faktiske testkode, så skal du redigere dit spørgsmål for at inkludere det.
Rediger
Yderligere test afslører, at .executeUpdate
returnerer 1 hvis
- Indsættelsesforsøget er afbrudt, fordi det ville resultere i en dublet UNIK nøgleværdi, og
- de angivne ON DUPLICATE KEY UPDATE ændringer ændrer faktisk ikke nogen værdier i den eksisterende række .
Dette kan bekræftes ved at køre ovenstående testkode to gange i træk med nøjagtig samme parameterværdier. Bemærk, at UPDATE ... id = LAST_INSERT_ID(id)
"trick" sikrer, at det korrekte id
værdi returneres.
Det forklarer sandsynligvis OP's testresultater, hvis den eneste værdi, der blev indsat, var den UNIKKE nøgleværdi.