2015-12-27 79 views
-1

比方说,我有动态数字与他们唯一的ID。PHP MySQL插入/更新多个值

我想将它们插入到数据库中。但是如果我已经有了这个特定的ID(UNIQUE),我需要添加到已经存在的值。

我已经尝试使用“开启关键更新”,但它并没有真正解决问题。选择旧数据,以便我们可以添加并更新它,效率不高。

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

+0

可能重复[PHP MYSQL更新如果存在或插入,如果不是?](http://stackoverflow.com/questions/6853190/php-mysql-update-if-exist-or-insert-if-not) –

+0

*“我已经尝试过使用”ON KEY UPDATE“,但它并没有真正解决问题”* - 以什么方式? “在重复密钥更新”是这里工作的正确工具 - 就像''INSERT INTO Foo SET bar =:bar复制密钥更新bar = bar +:bar“'应该做诀窍 - 但”这不是真的有效“不是我们可以调试的错误描述。 –

回答

0

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

而是做一些类似的更新:

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

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

这也是确保并发性的最安全的方法。

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

+0

这不回答这个问题。 OP指定可能不存在要更新的现有行。 –

+0

我恭敬地不同意。 OP首先知道ID的唯一方法是在数据库中选择它,或者尝试运行更新并计算返回的行。在select-first解决方案中,他总是必须执行两个查询,在后一个解决方案中,如果更新返回1,那么他不必运行第二个查询,如果它返回0,那么他知道该行不存在,并且他可以添加它。这是最高效的。 – ohiodoug

+1

对不起,我错过了答案中的详细信息,但仍然没有:执行更新,检查更新的行数,然后可能做一个插入操作并不是一个正确的解决方案。它受到与第一段中描述的大致相同的竞争条件,除非您手动包装更新并插入事务中。正确的方法是使用'ON DUPLICATE KEY UPDATE';例如,一个查询,如'INSERT INTO \'table \'SET \'number \'= 1,'''\'''''确保您只需要一个查询。 –

-1

做了些什么不同。我没有更新旧值,而是插入新数据并留下旧数据,但使用某些唯一标识符,因此不会有重复项。现在为了显示这些数据,我使用了一个带有sum属性的简单select查询,然后用id对它进行分组。很好的工作,只是不知道这是否是最有效的方式。

+0

大家都错过了我说过的观点,我有动态的数字。我无法通过循环来格式化MySQL以接受它们。唯一的选择是我写的。而你所有的答案都是基本的东西,已经存在于每个角落。 –