1

WordPress サイト (wp_postmeta テーブル) の投稿のメタデータを更新したいと考えています。既知の優れた関数update_post_meta()が機能しており、チェックを行い、キーが存在しない場合は追加します。ただし、この関数は一度に 1 つの投稿しか処理できません。高価なデータベース呼び出しを節約し、1 つのクエリで異なる投稿 ID の複数のフィールドを更新したいと考えています。

一般に、この例のように、mySQLクエリUPDATEを使用しCASEて、それぞれを切り替えて割り当て、テーブル内の異なる行のいくつかの値を更新できます。ただし、一部の投稿については、まだ存在していないため、必要で更新されていない可能性があります。まあ、 を使わないなら、どうにかしてこれをチェックする必要があります。( syntax ) と( syntax ) も使用しようとしましたが、一意の列または主キーとして定義された列にのみ関連するため、この場合は役に立ちません。meta_valuepost_idmeta_keyINSERTupdate_post_meta()INSERT .... ON DUPLICATE UPDATEREPLACE

「値を挿入し、このpost_idのこのmeta_keyが既に存在する場合は更新する」方法と、いくつかの異なるpost_ids(同じmeta_keyですが、ずっと)に対して、1つのmySQLクエリでこれを行う方法またはアイデアはありますか?

ありがとう(* WordPressの回答でもこれを尋ね、ここでも尋ねました)

4

1 に答える 1

4

REPLACEまた、 「一意または主キーとして定義されている列にのみ関連する」のでINSERT ... ON DUPLICATE KEY UPDATEなく、レコードが新規であるか既存であるか(したがって、置換/更新が必要)の判断は、一意のキーの衝突があるかどうかに基づいて行われます。か否か。MySQLのドキュメントに記載されているように:

REPLACEMySQLは(およびLOAD DATA ... REPLACE)に次のアルゴリズムを使用します。

  1. 新しい行をテーブルに挿入してみてください

  2. 主キーまたは一意のインデックスで重複キーエラーが発生したために挿入が失敗した場合:

    a。キー値が重複している競合する行をテーブルから削除します

    b。新しい行をテーブルに挿入してみてください

INSERT ... ON DUPLICATE KEY UPDATE 同様に説明します。

したがって、REPLACEまたはINSERT ... ON DUPLICATE KEY UPDATEコマンドが更新されたレコードを現在の主キーで識別する場合、それはあなたが望むことを正確に実行するはずです。WordPressのドキュメントによると、主キーはmeta_idフィールドであるためSELECT、既存のケースのこの識別子を取得し、外部結合を使用して、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"
;

新しいメタ値を投稿ごとに異なる場合は、次の2番目の列などの値を追加できます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"
;
于 2012-04-22T16:11:56.680 に答える