web-dev-qa-db-ja.com

WordPress / WooCommerceテーブルでは、価格は高くなっています。それらを再調整する方法? (キー=値の構造)

WordPress/Woocommerceテーブル(つまりmySQL)にab_postmetaでいくつかの製品の販売(割引)価格を設定しました。

SQLクエリ(WordPressが多すぎるためではありません)ではなく)で販売価格をリセットしても問題ないと考えました。

Update ab_postmeta set meta_value='' where meta_key='sale_price'

WordPressの他の部分では機能しましたが、機能しませんでした。詳しく調べたところ、ab_postmetaテーブルには、正常に動作するための通常の価格です。主な問題は、テーブルに次の構造を持つ垂直方向のkey = valueレイアウトがあることです。

ab_postmeta

  • meta_id-PK
  • post_id-投稿/製品へのFK
  • meta_key-キー
  • meta_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-対応する値が必要です):

Sample data

更新2:実際には、次のSQLでの変換が必要です。「各post_idについてmeta_value where meta_key='_max_variation_regular_price'から値を取得し、meta_value where(for例)meta_key='_price'(必要な宛先行ごとに例を変更します)

2
John Thomas

あなたの問題の私の翻訳は(あなたの説明から少し変更されています):

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はワイルドカードであるため、_文字を\_でエスケープする必要があります。

2
ypercubeᵀᴹ