使用PHP/MySql/PDO更新除自动递增字段之外的所有值


Update all values except auto-increment field using PHP / MySql / PDO

我有一个快速问题。。。我正在使用一个准备好的语句和一个数组更新一行中的所有值。

当最初插入时,我的语句看起来像这样(并且非常完美)

$sql="INSERT INTO $dbtable VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

第一个和最后一个值是NULL,因为第一个是自动递增ID字段,最后一个是时间戳字段。

有没有办法让我的UPDATE语句像INSERT语句一样简单。。。

$sql="UPDATE $dbtable SET (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) WHERE `announcements`.`id` = $id LIMIT 1";

我意识到这是不起作用的,因为第一个值是一个自动递增字段,有没有一个值我可以放进我的数组中"跳过"这个字段?

这可能不是描述我问题的最佳方式,但如果你需要更多信息,请告诉我!

提前谢谢!

UPDATE没有像INSERT那样的"隐式列"语法。您必须命名所有要更改的列。

您可以在MySQL中使用的一种替代方案是REPLACE:

REPLACE INTO $dbtable VALUES (?, ?, ?, ?, ?, ...)

通过这种方式,您可以传递主键的当前值,并更改其他列的值。

点击此处阅读有关REPLACE的更多信息:https://dev.mysql.com/doc/refman/5.6/en/replace.html

请注意,这在内部与@Devon建议使用两个语句非常相似,一个是DELETE,然后是INSERT。例如,当您运行REPLACE时,如果您有触发器,则会同时激活ON DELETE触发器和ON INSERT触发器。它对外键也有副作用。

我能想到的解决方案根本不涉及UPDATE

DELETE FROM $dbtable WHERE id = $id;
INSERT INTO $dbtable VALUES ($id, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);

由于您不想使用UPDATE语法,这将删除该行并添加一个具有相同id的新行,本质上是对其进行更新。我建议将其包装在事务中,这样,如果插入因任何原因失败,您就不会丢失前一行。