是否有可能在mysql中更新然后INSERT?

时间:2011-12-14 20:45:30

标签: php mysql

是否有可能UPDATE然后INSERT在mysql中存在行?我有这个问题,

$q = $dbc -> prepare("UPDATE accounts SET lifeforce = maxLifeforce, inHospital = 0 WHERE hospitalTime <= NOW() AND inHospital = 1");
$q -> execute();

如何将主键变为关联数组,然后对数组中的每个项执行插入,或者执行UPDATE AND INSERT?

或者它是否涉及执行SELECT以获得所有匹配条件,然后UPDATE然后使用select中的数组INSERT?这似乎还有很长的路要走?

基本上我需要使用更新的相同主键INSERT到另一个表。

3 个答案:

答案 0 :(得分:3)

  

或者它是否涉及执行SELECT以获得所有匹配条件,然后UPDATE然后使用select中的数组INSERT?

是的,抱歉,这是主要方式。

另一种方法是添加一个名为(例如)last_updated的列,您可以在更新列时设置该列。然后,您可以在驱动插入的查询中使用该列。这将有其他优点 - 我发现last_updated列对许多事情都很有用 - 但如果这是你用过的唯一的东西就太过分了。


编辑添加:我刚刚遇到的另一个选项是add a trigger到您的accounts表,它将执行您需要的插入。这在质量上是不同的 - 它导致插入是accounts的属性,而不是应用程序逻辑的问题 - 但也许这就是你想要的?即使是“在数据库中放置所有约束 - 所以应用程序逻辑 - 永不引入 - 不一致”阵营的最极端的支持者通常对触发器持谨慎态度 - 它们实际上不是实现应用程序的好方法逻辑,因为它隐藏了那个没有人会想到的逻辑。但是,如果您要插入的表是某种account_history表,它将跟踪account的所有更改,那么它可能就是您的选择。

答案 1 :(得分:0)

您可以使用手册中所述的多表更新:http://dev.mysql.com/doc/refman/5.0/en/update.html

如果第二个表需要插入,则可能需要手动执行。

答案 2 :(得分:0)

您可以使用mysqli_last_id函数: http://php.net/manual/en/mysqli.insert-id.php

此外,当运行这样的连续查询时,我建议使用事务: http://www.techrepublic.com/article/implement-mysql-based-transactions-with-a-new-set-of-php-extensions/6085922