Php 使用主键进行重复密钥更新

Php 使用主键进行重复密钥更新,php,mysql,wordpress,Php,Mysql,Wordpress,我正在尝试更新WP中的PosteTa表。我正在使用下面的查询设置新行。但是,如果该行已经存在,我只想更新meta_值。目前,每次我运行它时,它都会不断为每个产品[0]添加新行,即使它已经存在 $sql = "INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES ($productID[0], 'custom_field', 'worked') ON DUPLICATE KEY UPDATE meta_value = 'cha

我正在尝试更新WP中的PosteTa表。我正在使用下面的查询设置新行。但是,如果该行已经存在,我只想更新meta_值。目前,每次我运行它时,它都会不断为每个产品[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'"

如果尚未在表上定义唯一索引或主索引,则会发生这种情况。大概,每个post_id/meta_键组合只需要一行

尝试添加以下内容:

create unique index idx_wp_postmeta_2 on wp_postmeta(post_id, meta_key)

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

使用自定义查询更新Posteta表有什么具体原因吗

而使用WordPress的内置功能也可以实现同样的效果

是一个内置函数,它将更新表中的行,否则,它将添加新条目

您可以按功能进行检查

e、 g


谢谢戈登,但我该在哪里输入这个?@Matt。您可以在数据库中运行它,比如通过phpadmin。请花点时间阅读您发布的内容。当你希望有人帮助你时,通过避免文本中的打字错误来表示尊重。
if(get_post_meta($productID[0], 'custom_field', true) == 'worked') {
    update_post_meta($productID[0], 'custom_field', 'changed');
}