WPDB插入或如果存在更新

时间:2014-05-20 作者:Howdy_McGee

一般来说,我对WPDB或SQL不太熟悉,但我的项目有一个自定义表,我正在尝试为它分配一些元数据。我“希望”发生的是,如果存在一行,则更新它,如果不存在,则插入它。我已经阅读了WPDB Codex中的Insert和Update,但都没有真正进入“非此即彼”的状态。我想我可以使用update,所以到目前为止我的代码如下所示:

$wpdb->update(
    $wpdb->prepare(
        $wpdb->prefix.\'item_info\',
        array(
            \'post_id\'       => $post_id,
            \'item_stock\'    => $item_stock
        ),
        array(\'post_id\' => $post_id)
    )
);
WordPress是否具有类似“IF exists Update,ELSE Insert”的功能,或者我是否需要运行自定义SQL来实现此功能,或者我是否需要先查询数据库以查看我的表中是否存在ID,然后决定是更新还是插入它?

4 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

首先,您正在使用prepare 不正确。你好像有$wpdb->update\'s参数包装在$wpdb->prepare 就像那样。那行不通。实际上,您正在通过update 单个参数--的输出prepare. 尝试以下简单方法,您就会明白为什么这样做行不通:

$post_id = 123;
$item_stock = 567;
var_dump(
  $wpdb->prepare(
    $wpdb->prefix.\'item_info\',
    array(
        \'post_id\'       => $post_id,
        \'item_stock\'    => $item_stock
    ),
    array(\'post_id\' => $post_id)
  )
);
And $wpdb->update() runs prepare for you.

其次,如果这是我,我会跳过helper函数膨胀并编写一个适当的ON DUPLICATE KEY UPDATE 查询:

$sql = "INSERT INTO {$wpdb->prefix}item_info (post_id,item_stock) VALUES (%d,%s) ON DUPLICATE KEY UPDATE item_stock = %s";
// var_dump($sql); // debug
$sql = $wpdb->prepare($sql,$post_id,$item_stock,$item_stock);
// var_dump($sql); // debug
$wpdb->query($sql);
这假设post_id 是一个UNIQUE index or PRIMARY KEY. 如果您的表结构是我认为的那样,那么让数据库来处理它。

SO网友:e-crespo

你试过了吗$wpdb->replace. 根据WP Codex:

如果表中存在行,请替换该行;如果该行不存在,请在表中插入新行。

我已经在一些插件中尝试过了,它在尝试避免独特的ID复制错误等时起到了作用。

More info in the codex

SO网友:Darrel K.

您可以尝试使用$wpdb->update, 我在下面的代码中使用id,但您可以使用任何条件。

$result = $wpdb->update($tableName, $info, array(\'id\' => $info["id"]));
//If nothing found to update, it will try and create the record.
if ($result === FALSE || $result < 1) {
    $wpdb->insert($tableName, $info);
}

Update() result output

  • $result === FALSE : 失败$result === 0 : 成功,但没有更新$result > 1: 成功并更新

SO网友:felipelavinz

您应该首先检查该行是否存在。

您很可能希望尝试获取要更新的行的ID或主键,然后$wpdb->update 如果是或$wpdb->insert 当然不是

结束