REPLACE
また、 「一意または主キーとして定義されている列にのみ関連する」のでINSERT ... ON DUPLICATE KEY UPDATE
はなく、レコードが新規であるか既存であるか(したがって、置換/更新が必要)の判断は、一意のキーの衝突があるかどうかに基づいて行われます。か否か。MySQLのドキュメントに記載されているように:
REPLACE
MySQLは(およびLOAD DATA ... REPLACE
)に次のアルゴリズムを使用します。
新しい行をテーブルに挿入してみてください
主キーまたは一意のインデックスで重複キーエラーが発生したために挿入が失敗した場合:
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"
;