gpt4 book ai didi

mysql - 在一个 mySQL 查询中更新多个 post_meta 数据

转载 作者:行者123 更新时间:2023-11-29 00:46:40 25 4
gpt4 key购买 nike

我想对 WordPress 站点(wp_postmeta 表)中的帖子元数据执行一些更新。已知的 good'ol 函数 update_post_meta() 正在完成这项工作,并且还将检查,如果 key 不存在,它将添加它。但是,此功能一次只能处理一篇文章。我想节省昂贵的数据库调用,并通过一次查询更新不同帖子 ID 的多个字段。

通常,我可以使用带有 CASE 的 mySQL UPDATE 查询来根据 post_id 切换和分配每个 meta_value , 比如 in this example , 并更新表中不同行的一些值。但是,对于某些帖子,可能 meta_key 尚不存在,因此需要 INSERT 而不是更新。好吧,如果不使用 update_post_meta(),我应该以某种方式检查它。我尝试使用 INSERT .... ON DUPLICATE UPDATE ( syntax ) 和 REPLACE ( syntax ),但它只与唯一的列相关或定义为主键,因此在这种情况下无济于事。

有没有一种方法或想法可以让我如何拥有“插入值,如果这个 post_id 已经存在这个 meta_key 则更新”并对几个不同的 post_ids(相同的 meta_key 但一直)执行此操作,并使用一个单个 mySQL 查询?

谢谢(* 我也在 WordPress 答案中问过这个问题,也在这里问过)

最佳答案

REPLACEINSERT ... ON DUPLICATE KEY UPDATE “仅与唯一或定义为主键的列相关” ,而是根据是否存在唯一键冲突来确定记录是新的还是已经存在的(因此需要替换/更新)。作为MySQL documentation状态:

MySQL uses the following algorithm for REPLACE (and LOAD DATA ... REPLACE):

  1. Try to insert the new row into the table

  2. While the insertion fails because a duplicate-key error occurs for a primary key or unique index:

    a. Delete from the table the conflicting row that has the duplicate key value

    b. Try again to insert the new row into the table

它描述了INSERT ... ON DUPLICATE KEY UPDATE similarly .

因此,如果您的 REPLACEINSERT ... ON DUPLICATE KEY UPDATE 命令通过当前主键识别您更新的记录,它应该完全按照您的意愿行事。根据WordPress documentation ,主键是 meta_id 字段,因此使用 SELECT 可以为现有案例获取此标识符,使用外部连接可以获取 NULL如果它不存在(sets the column to the next auto_increment value):

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"
;

关于mysql - 在一个 mySQL 查询中更新多个 post_meta 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10269406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com