【问题标题】:PHP MySQL inserting/updating multiple valuesPHP MySQL插入/更新多个值
【发布时间】:2016-04-01 08:28:11
【问题描述】:

假设我有具有唯一 ID 的动态数字。

我想将它们插入数据库。但是,如果我已经拥有该特定 ID(唯一),我需要添加到已经存在的值。

我已经尝试过使用“ON KEY UPDATE”,但它并没有真正奏效。并且选择旧数据以便我们可以添加它然后更新它,效率不高。

是否有任何查询可以做到这一点?

【问题讨论】:

  • “我已经尝试过使用“ON KEY UPDATE”,但它并没有真正奏效” - 以什么方式? ON DUPLICATE KEY UPDATE 是完成这项工作的正确工具 - 像 "INSERT INTO Foo SET bar=:bar ON DUPLICATE KEY UPDATE bar=bar+:bar" 这样的东西应该可以解决问题 - 但“它并没有真正解决问题”不是我们可以调试的错误描述。

标签: php mysql


【解决方案1】:

由于并发问题,在您的应用程序中增加您的价值并不能保证您的数据库中始终有准确的结果。例如,如果两个 Web 请求需要增加具有相同 ID 的数字,则取决于计算机何时切换 CPU 上的进程,您可能会让请求相互覆盖。

改为进行类似于以下的更新:

UPDATE `table` SET `number` = `number` + 1 WHERE `ID` = YOUR_ID

检查语句的返回值。更新应该返回受影响的行数,因此如果值为 1,您可以继续高兴地知道自己尽可能高效。另一方面,如果您的返回值为 0,那么您将不得不运行后续的插入语句来添加您的新 ID/值。

这也是保证并发最安全的方式。

希望这会有所帮助,祝你好运!

【讨论】:

  • 这不能回答问题。 OP 指定可能没有要更新的现有行。
  • 我不同意。 OP 知道 ID 的唯一方法首先是在数据库中,要么选择它,要么尝试运行更新并计算返回的行数。在 select-first 解决方案中,他总是必须执行两个查询,在后一个解决方案中,如果更新返回 1,那么他不必运行第二个查询,如果返回 0,那么他知道该行不存在并且他可以添加它。这是最有效的。
  • 抱歉,我错过了您的回答中的那个细节,但仍然没有:进行更新,检查更新的行数,然后可能进行插入不是正确的解决方案。它遭受与您在第一段中描述的大致相同的竞争条件,除非您手动包装更新并插入事务中。正确的做法是使用ON DUPLICATE KEY UPDATE;例如,像INSERT INTO `table` SET `number` = 1, `ID` = YOUR_ID ON DUPLICATE KEY UPDATE `number` = `number` + 1; 这样的查询保证您只需要一个查询。
  • 好点。我假设一个自动生成的值,这不会是一个问题,但如果它是一个具有额外含义的键并且是插入的一部分,那么是的,仍然存在一个问题,并且 DUPLICATE KEY UPDATE 是要走的路.
【解决方案2】:

做了一些不同的事情。我没有更新旧值,而是插入新数据并留下旧数据,但使用某些唯一值,这样我就不会重复了。现在要显示该数据,我使用带有 sum 属性的简单选择查询,然后按 id 对其进行分组。效果很好,只是不知道这是否是最有效的方法。

【讨论】:

  • 大家都错过了我说的重点,我有动态数字。在地狱中,我无法将循环中的那些格式化为 MySQL 接受。唯一的选择是我写的那个。你所有的答案都只是基本的东西,已经存在于每个可能的角落。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多