如果未找到 MySQL 更新行 insert -Preference for update first

标签 mysql

我已经看到了一些与此相关的问题,如下所示 MySQL “good” way to insert a row if not found, or update it if it is found

现在我有一个汇总表,每次发生销售时都会更新数量。因此,只有在第一次执行插入时才售出 1000 件商品,其余时间都会更新。我的理解是在 Insert on Duplicate Key Update 它尝试先插入,如果更新失败。所以所有999次插入都不成功

1) 是否有一种方法可以先检查更新,如果没有更新则插入单个语句?

2) 考虑到大多数情况下更新会成功,下面哪种方法是可取的

a) 使用 Insert on Duplicate Key Update b) 调用更新;如果没有行受影响调用插入

现在我正在使用第二个选项(b)。性能增益在这里非常重要,我也在测试第一个选项。完成后我会在这里发布结果

最佳答案

INSERT ON DUPLICATE KEY UPDATE 是要走的路。它不会执行完整插入或您如何放置它。
要使此语句起作用,表中必须有一个主键或唯一键,并且语句中必须涉及相应的列。
在决定是否必须执行插入或更新语句之前,将检查上述键。这通常非常快。

采用“先更新”的方法,您一无所获,只会变得更糟。无论如何都必须进行主键查找。在最坏的情况下,您不得不两次查找主键而浪费时间。首先是更新语句(这可能不是必需的),然后是插入语句。

关于如果未找到 MySQL 更新行 insert -Preference for update first,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29620667/

相关文章:

mysql - 创建外键的正确语法

mysql - 为什么 INNODB 批量插入会导致自动增量主键跳过值?

mysql - 数据库中是否需要将域名存储为md5模式?

mysql - MySqlBulkLoader 可以与事务一起使用吗?

java - Jasper报告连接到mysql时服务器连接失败

Java MySQL——错误的语法

php - 如何使用 NGINX、PHP-FPM 在 docker-compose.yml 文件中加载 mysqli 扩展

javascript - 通过单击按钮引用 li 的跨度

java - 防止JSP页面中输入空值

mysql - 如何将 Visual Studio 连接到 Aurora MySQL DB?