REPLACE
并且INSERT ... ON DUPLICATE KEY UPDATE
不是“仅与唯一或定义为主键的列相关”,而是根据是否存在唯一键冲突来确定记录是新的还是已经存在的(因此需要替换/更新)或不。正如MySQL 文档所述:
REPLACE
MySQL 对(and )使用以下算法LOAD DATA ... REPLACE
:
尝试将新行插入表中
由于主键或唯一索引发生重复键错误,插入失败:
一种。从表中删除具有重复键值的冲突行
湾。再次尝试将新行插入表中
它的描述INSERT ... ON DUPLICATE KEY UPDATE
类似。
因此,如果您的REPLACE
orINSERT ... ON DUPLICATE KEY UPDATE
命令通过它们当前的主键标识您更新的记录,它应该完全按照您的意愿行事。根据WordPress 文档,主键是meta_id
字段,因此使用 aSELECT
获取现有案例的此标识符并使用外部连接,获取NULL
它是否不存在(将列设置为下一个auto_increment
值):
REPLACE INTO `wp_postmeta` (
`meta_id`
, `post_id`
, `meta_key`
, `meta_value`
)
SELECT
`meta_id`
, `post_id`
, "key of interest"
, "new value" -- assuming all posts to be set the same
FROM
`wp_postmeta`
NATURAL RIGHT JOIN (
SELECT 1 AS `post_id` -- where 1 is the first post_id
UNION SELECT 2 -- 2 is the second
UNION SELECT 3 -- 3 is the third
-- etc.
) AS `temp_table`
WHERE
`meta_id` IS NULL OR `meta_key` = "key of interest"
;
如果每个帖子的新元值都不同,您可以添加这样的值作为第二列temp_table
:
REPLACE INTO `wp_postmeta` (
`meta_id`
, `post_id`
, `meta_key`
, `meta_value`
)
SELECT
`meta_id`
, `post_id`
, "key of interest"
, `new_value`
FROM
`wp_postmeta`
NATURAL RIGHT JOIN (
SELECT 1 AS `post_id`, "foo" AS `new_value`
UNION SELECT 2, "bar"
UNION SELECT 3, "qux"
-- etc.
) AS `temp_table`
WHERE
`meta_id` IS NULL OR `meta_key` = "key of interest"
;