Java PreparedStatement和ON DUPLICATE KEY UPDATE:我如何知道是插入行还是更新行?

ed22

具有以下代码,我如何知道execute()方法是导致插入还是导致更新?:

Connection c = DriverManager.getConnection(connectionString);

PreparedStatement st = c.prepareStatement("INSERT INTO `table`(`field1`) VALUES (?) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);");

st.setString(1,"some value");
st.execute();

提前致谢。

戈德·汤普森

考虑下面的MySQL测试表:

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 ;

现有的样本数据如下:

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

使用默认的连接设置compensateOnDuplicateKeyUpdateCounts=false此处描述),以下Java代码

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

产生以下控制台输出

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

现在,再次使用参数值运行相同的代码

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

控制台输出是

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

这表明.executeUpdate如果唯一索引导致现有行被更新,则实际上可以返回2。如果您需要有关实际测试代码的进一步帮助,则应编辑问题以将其包括在内。

编辑

进一步的测试表明,.executeUpdate如果

  1. 尝试的INSERT被终止,因为它将导致重复的UNIQUE键值,并且
  2. 指定的ON DUPLICATE KEY UPDATE更改实际上不会修改现有行中的任何值

可以通过使用完全相同的参数值连续两次运行上述测试代码来确认这一点。请注意,UPDATE ... id = LAST_INSERT_ID(id)“技巧”确实可以确保id返回正确的值。

如果唯一要插入的值是UNIQUE键值,这可能可以解释OP的测试结果。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java上的MySQL“ INSERT ... ON DUPLICATE KEY UPDATE”:如何区分插入/更新/ NoChange状态

来自分类Dev

通过SELECT和ON DUPLICATE KEY UPDATE将PDO插入

来自分类Dev

MySQL ON DUPLICATE KEY UPDATE和auto_increment索引

来自分类Dev

ON DUPLICATE KEY UPDATE错误响应

来自分类Dev

调整 INSERT ON DUPLICATE KEY UPDATE

来自分类Dev

php ON DUPLICATE KEY UPDATE 还说 1062: Duplicate entry for key 'PRIMARY'

来自分类Dev

MySQL UPDATE ON DUPLICATE KEY仅插入

来自分类Dev

使用ON DUPLICATE KEY UPDATE从SELECT插入

来自分类Dev

插入(使用select语句)和基于select语句的其他ON DUPLICATE KEY UPDATE

来自分类Dev

MySQL ON DUPLICATE KEY UPDATE不会更新而是插入

来自分类Dev

ON DUPLICATE KEY UPDATE用新值更新

来自分类Dev

仅更新ON DUPLICATE KEY UPDATE的更改值

来自分类Dev

INSERT INTO... ON DUPLICATE KEY UPDATE 不更新 PHP 和 mySQL 中的重复值

来自分类Dev

MySQL-如何在批处理INSERT ON DUPLICATE KEY UPDATE查询中计算INSERT和UPDATES?

来自分类Dev

MySQL-如何在批处理INSERT ON DUPLICATE KEY UPDATE查询中计算INSERT和UPDATES?

来自分类Dev

Java 7,try-with-resources:我可以省略创建Connection和PreparedStatement吗?

来自分类Dev

一个查询中的MYSQL ON DUPLICATE KEY UPDATE和IGNORE

来自分类Dev

将内部联接和where子句添加到INSERT INTO ON DUPLICATE KEY UPDATE

来自分类Dev

在SQLITE Android中模拟DUPLICATE KEY UPDATE

来自分类Dev

MySQL DUPLICATE KEY UPDATE + SUM函数

来自分类Dev

INSERT ... ON DUPLICATE KEY UPDATE不起作用

来自分类Dev

ON DUPLICATE KEY UPDATE 콜백-MySQL

来自分类Dev

ON DUPLICATE KEY UPDATE回调-MySQL

来自分类Dev

在Zend中查询“ ON DUPLICATE KEY UPDATE”

来自分类Dev

python mysql DUPLICATE KEY UPDATE rrror

来自分类Dev

JDBC PreparedStatement,如何选择和插入?

来自分类Dev

MySQL 使用 Bind_Param 和 ON DUPLICATE KEY

来自分类Dev

如何在 django 中执行...ON DUPLICATE KEY UPDATE...

来自分类Dev

插入(如果不存在),否则删除-使用ON DUPLICATE KEY

Related 相关文章

  1. 1

    Java上的MySQL“ INSERT ... ON DUPLICATE KEY UPDATE”:如何区分插入/更新/ NoChange状态

  2. 2

    通过SELECT和ON DUPLICATE KEY UPDATE将PDO插入

  3. 3

    MySQL ON DUPLICATE KEY UPDATE和auto_increment索引

  4. 4

    ON DUPLICATE KEY UPDATE错误响应

  5. 5

    调整 INSERT ON DUPLICATE KEY UPDATE

  6. 6

    php ON DUPLICATE KEY UPDATE 还说 1062: Duplicate entry for key 'PRIMARY'

  7. 7

    MySQL UPDATE ON DUPLICATE KEY仅插入

  8. 8

    使用ON DUPLICATE KEY UPDATE从SELECT插入

  9. 9

    插入(使用select语句)和基于select语句的其他ON DUPLICATE KEY UPDATE

  10. 10

    MySQL ON DUPLICATE KEY UPDATE不会更新而是插入

  11. 11

    ON DUPLICATE KEY UPDATE用新值更新

  12. 12

    仅更新ON DUPLICATE KEY UPDATE的更改值

  13. 13

    INSERT INTO... ON DUPLICATE KEY UPDATE 不更新 PHP 和 mySQL 中的重复值

  14. 14

    MySQL-如何在批处理INSERT ON DUPLICATE KEY UPDATE查询中计算INSERT和UPDATES?

  15. 15

    MySQL-如何在批处理INSERT ON DUPLICATE KEY UPDATE查询中计算INSERT和UPDATES?

  16. 16

    Java 7,try-with-resources:我可以省略创建Connection和PreparedStatement吗?

  17. 17

    一个查询中的MYSQL ON DUPLICATE KEY UPDATE和IGNORE

  18. 18

    将内部联接和where子句添加到INSERT INTO ON DUPLICATE KEY UPDATE

  19. 19

    在SQLITE Android中模拟DUPLICATE KEY UPDATE

  20. 20

    MySQL DUPLICATE KEY UPDATE + SUM函数

  21. 21

    INSERT ... ON DUPLICATE KEY UPDATE不起作用

  22. 22

    ON DUPLICATE KEY UPDATE 콜백-MySQL

  23. 23

    ON DUPLICATE KEY UPDATE回调-MySQL

  24. 24

    在Zend中查询“ ON DUPLICATE KEY UPDATE”

  25. 25

    python mysql DUPLICATE KEY UPDATE rrror

  26. 26

    JDBC PreparedStatement,如何选择和插入?

  27. 27

    MySQL 使用 Bind_Param 和 ON DUPLICATE KEY

  28. 28

    如何在 django 中执行...ON DUPLICATE KEY UPDATE...

  29. 29

    插入(如果不存在),否则删除-使用ON DUPLICATE KEY

热门标签

归档