2012-04-22 34 views
0

WordPressサイト(wp_postmetaテーブル)に投稿のメタデータを更新したいと考えています。 既知のgood'ol関数update_post_meta()がジョブを実行しているかどうかを確認し、存在しない場合は追加します。 しかし、この関数は一度に1つの投稿のみを処理できます。 私は高価なdbコールを保存し、異なるpost idのために1つのクエリでいくつかのフィールドを更新したいと思います。複数のpost_metaデータを1つのmySQLクエリで更新する

一般に、私はswichするCASEでMySQL UPDATEクエリを使用して割り当てることができ、各meta_valuein this examplepost_idに従って、及びテーブル内の異なる行のいくつかの値を更新します。 しかし、投稿の中にはmeta_keyがまだ存在しないので、INSERTが必要であり、更新されていない可能性があります。まあ、update_post_meta()を使用しない場合、私は何とかこれをチェックする必要があります。 INSERT .... ON DUPLICATE UPDATEsyntax)とREPLACEsyntax)を使用しようとしましたが、一意の、または主キーとして定義されている列のみに関係しているので、この場合は役に立ちません。

"この値を挿入してこのpost_idに既にこのmeta_keyが存在する場合はどうすればいいですか"ということと、いくつかの異なるpost_id(同じmeta_keyを使用しています)のための方法やアイデアはありますか? 1つの単一のMySQLのクエリ?

おかげで (* IはWordPressの答えでも、これを聞くと、ここにも尋ねる)

答えて

1

REPLACEINSERT ... ON DUPLICATE KEY UPDATEは決意むしろ、ない「のみ一意または主キーとして定義された列に関連する」です一意のキー衝突があるかどうかにかかわらず、レコードが新規であるか、または既に存在している(したがって、置換/更新する必要がある)かどうかの判断が行われる。

MySQLはREPLACE(およびLOAD DATA ... REPLACE)のために、以下のアルゴリズムを使用しています:

  1. があるため、挿入が失敗しますが、テーブルに

  2. を新しい行を挿入しようとMySQL documentation状態として主キーまたはユニークインデックスの重複キーエラーが発生します。

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

    b。それはINSERT ... ON DUPLICATE KEY UPDATEsimilarlyを説明し

テーブルに新しい行を挿入するには、再度お試しください。

したがって、REPLACEまたはINSERT ... ON DUPLICATE KEY UPDATEコマンドは、更新されたレコードを現在のプライマリキーで識別していれば、あなたが望むものと正確に一致するはずです。あなたはそれがまだ存在しない場合(これsets the column to the next auto_increment value)をNULLを取得し、参加既存のケースのためにと外側で、この識別子を取得SELECTとなるようWordPress documentationによると、主キーはmeta_idフィールドは、次のとおりです。

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の2列目のような値を追加することができますが:

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

はあなたの非常に説明した解答とクエリの例をありがとうございました!私は次の日にこれをテストします、私はそれが問題を解決すると仮定します。 –

関連する問題