使用主键重复密钥更新

时间:2015-02-13 12:23:13

标签: php mysql wordpress

我正在尝试更新WP中的postmeta表。我使用以下查询来设置新行。但是,如果该行已存在,我只想更新meta_value。目前,每次运行时,它都会为每个product[0]添加一个新行,即使它已经存在。

$sql = "INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES ($productID[0], 'custom_field', 'worked') ON DUPLICATE KEY UPDATE meta_value = 'changed'"; 
$wpdb->query( 
    $wpdb->prepare( $sql )
);

当我转储最后一个查询时,它给了我下面的内容,我似乎无法看清楚是什么问题。

"INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES (1836, 'custom_field', 'worked') ON DUPLICATE KEY UPDATE meta_value = 'changed'"

2 个答案:

答案 0 :(得分:0)

如果您尚未在表上定义唯一索引或主索引,则会发生这种情况。据推测,每个post_id / meta_key组合只需要一行。

尝试添加此内容:

create unique index idx_wp_postmeta_2 on wp_postmeta(post_id, meta_key)

然后您的查询应该更新值而不是插入新行。

答案 1 :(得分:0)

您是否有使用自定义查询更新postmeta表的具体原因?

虽然你可以使用WordPress的内置功能实现同样的目的。

update_post_meta 是内置函数,如果存在于表中则会更新行,否则会添加新条目。

您可以通过 get_post_meta() 功能进行检查。

e.g。

if(get_post_meta($productID[0], 'custom_field', true) == 'worked') {
    update_post_meta($productID[0], 'custom_field', 'changed');
}