在 WordPress/WooCommerce 表中,價格被沖洗掉了。如何重新排列它們?(鍵=值結構)
我們在我們的 WordPress/Woocommerce 表(因此是 mySQL)ab_postmeta 中有一些產品的銷售(折扣)價格。
我們認為通過 SQL 查詢(而不是通過 WordPress,因為它們太多)來重置銷售價格是可以的。我們所做的是:
Update ab_postmeta set meta_value='' where meta_key='sale_price'
對於 WordPress 的某些部分,它對其他部分無效。經過仔細檢查,我們發現ab_postmeta表還有其他值,這些值應該重置為正常價格才能正常工作。我們的主要困難是表格具有垂直鍵=值佈局,結構如下:
ab_postmeta
- meta_id - PC
- post_id - 對文章/產品的 FK
- meta_key - 鍵
- meta_value - 上面的鍵(屬性)的值
基本上,我們需要一個更新查詢,它將獲取meta_key=’_max_variation_regular_price’的(數字)值並將其放入meta_key=’_price’和meta_key=’_max_variation_sale_price’以及****相同 post_id的其他鍵值中。如果我們從控制台為每個目標鍵多次執行 SQL 查詢,就可以了。
怎麼做?(我不敢嘗試,因為我在現場數據庫上)。
更新:
這是一個數據範例:(我們需要做的是:所有“263”必須變為“329” - 我們必鬚根據Post_id(必須相同)和meta_key從一個源記錄複製到另一個目標記錄-必須有相應的值):
更新 2:事實上,我們需要在 SQL 中翻譯以下內容:“對於每個
post_id
從meta_value
哪裡獲取值meta_key='_max_variation_regular_price'
並將其放在meta_value
哪裡(例如)meta_key='_price'
(我們將為我們需要的每個目標行更改您的範例)
我對您的問題的翻譯是(與您的描述略有不同):
對於每一個,從where 列中
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
而不是更多(跳過這一步)都有一個值。現在,讓我們找到需要更新的行:
-- query2 SELECT post_id, meta_key, meta_value FROM ab_postmeta WHERE meta_key LIKE '%\_price' AND meta_key <> '_max_variation_regular_price' ;
然後我們可以將兩個選擇合二為一:
-- 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 修復錯誤。應該使用萬用字元來
LIKE
轉義_
字元。\_