WordPress/Woocommerceテーブル(つまりmySQL)にab_postmetaでいくつかの製品の販売(割引)価格を設定しました。
SQLクエリ(WordPressが多すぎるためではありません)ではなく)で販売価格をリセットしても問題ないと考えました。
Update ab_postmeta set meta_value='' where meta_key='sale_price'
WordPressの他の部分では機能しましたが、機能しませんでした。詳しく調べたところ、ab_postmetaテーブルには、正常に動作するための通常の価格です。主な問題は、テーブルに次の構造を持つ垂直方向のkey = valueレイアウトがあることです。
基本的に、meta_key = '_ max_variation_regular_price'の(数値)値を取得して配置するpdateクエリが必要ですmeta_key = '_ price'およびmeta_key = '_ max_variation_sale_price'およびsame post_idの他のキー値。コンソールから各ターゲットキーに対してSQLクエリを複数回実行しても問題ありません。
どうやってするか? (私はライブDBを使用しているため、実験することを恐れています)。
更新:
データのサンプルを次に示します:(必要なのは、すべての„ 263”が„ 329”になることです-Post_idに基づいて、あるソースレコードから別の宛先レコードにコピーする必要があります(=同じである)およびmeta_key-対応する値が必要です):
更新2:実際には、次のSQLでの変換が必要です。「各post_id
についてmeta_value
where meta_key='_max_variation_regular_price'
から値を取得し、meta_value
where(for例)meta_key='_price'
(必要な宛先行ごとに例を変更します)
あなたの問題の私の翻訳は(あなたの説明から少し変更されています):
各post_id
について、meta_value
列の値meta_key = '_max_variation_regular_price'
から値を検索し、meta_value
に同じpost_id
を含む他のすべての行のメタキーがある場所に配置します。 「価格」(つまり、meta_key LIKE '%\_price'
)*。
さて、何かをして本番データベースのデータを変更する前に、最善のアプローチは、バックアップを取り、そのバックアップを別のデータベースとして復元し、復元した(コピー)データベースで遊んでみることです。
必要な値を持つ行を特定しましょう:
-- query1
SELECT post_id, meta_value AS price
FROM ab_postmeta
WHERE meta_key = '_max_variation_regular_price' ;
(post_id, meta_key)
にUNIQUE
制約がある場合、それだけが必要な値です。そうでない場合は、結果がpost_id
ごとに1つ以上の値を持たないようにするために、追加の手順を実行する必要がある場合があります(この手順はスキップします)。
次に、更新が必要な行を見つけてみましょう。
-- query2
SELECT post_id, meta_key, meta_value
FROM ab_postmeta
WHERE meta_key LIKE '%\_price'
AND meta_key <> '_max_variation_regular_price' ;
次に、2つの選択を1つに結合できます。
-- query3
SELECT upd.post_id, upd.meta_key,
upd.meta_value AS old_price,
good.meta_value AS good_price
FROM ab_postmeta AS good -- the table with the good prices
JOIN ab_postmeta AS upd -- the table to be updated
ON good.post_id = upd.post_id
WHERE good.meta_key = '_max_variation_regular_price'
AND upd.meta_key LIKE '%\_price'
AND upd.meta_key <> '_max_variation_regular_price' ;
これを実行して結果を検査し、更新内容を確認できます。 UPDATE
はまだ実行されていません!。その後、そして検査が正しいようであれば、実際のUPDATE
を実行できます。以前のSELECT
とよく似ていることに注意してください。 WHERE
句は同一であり、FROM
句はUPDATE
になりました。しかし、念のため、トランザクション内で実行します。
BEGIN ; -- start a transaction.
UPDATE ab_postmeta AS good -- the table with the good prices
JOIN ab_postmeta AS upd -- the table to be updated
ON good.post_id = upd.post_id
SET
upd.meta_value = good.meta_value
WHERE good.meta_key = '_max_variation_regular_price'
AND upd.meta_key LIKE '%\_price'
AND upd.meta_key <> '_max_variation_regular_price' ;
Query2をもう一度実行して、新しい値を確認します。
SELECT post_id, meta_key, meta_value
FROM ab_postmeta
WHERE meta_key LIKE '%\_price'
AND meta_key <> '_max_variation_regular_price' ;
今、すべて大丈夫ですか?すべてのアップデートは良さそうですか?
いいえの場合、ROLLBACK ;
を実行し、害はありませんでした。もう一度アルゴリズムを評価するか、より小さなセットで実行します。
はいの場合は、COMMIT ;
を実行すると、変更が永続的になります。これは、本番環境で(再度)安全に実行できます。
* バグ修正のためにAndriyにThnx。 LIKE
はワイルドカードであるため、_
文字を\_
でエスケープする必要があります。