2012-04-22 64 views
0

我想在WordPress站點(wp_postmeta表)中對帖子的元數據執行一些更新。 已知的good'ol功能update_post_meta()正在做這項工作,也將檢查,如果密鑰不存在,它會添加它。 但是,此功能一次只能處理一個帖子。 我想節省昂貴的數據庫調用和更新與一個查詢幾個字段爲不同的職位ID。在一個mySQL查詢中更新多個post_meta數據

一般情況下,我可以使用MySQL UPDATE查詢與CASE到SWICH並指定每個meta_value根據post_id,像in this example,並更新表中的不同行的一些值。 但是,可能對於某些帖子,meta_key尚不存在,因此需要INSERT而不是更新。那麼,如果不使用update_post_meta(),我應該以某種方式檢查。我嘗試使用INSERT .... ON DUPLICATE UPDATEsyntax)和REPLACEsyntax),但它僅適用於唯一或定義爲主鍵的列,因此在這種情況下它不起作用。

有沒有一種方法或想法,我怎麼能夠「插入值,如果已經存在這個meta_key這個post_id更新」,併爲幾個不同的post_ids(然而一直meta_key相同),並與一個單一的mySQL查詢?

感謝 (*我問這個也是在WordPress的答案,並要求在這裏太)

回答

1

REPLACEINSERT ... ON DUPLICATE KEY UPDATE「相關僅是唯一的或定義主鍵列」,而確定記錄是新的還是已經存在的(並且因此需要被替換/更新)是否存在唯一的密鑰衝突。由於MySQL documentation狀態:

MySQL使用以下算法REPLACE(和LOAD DATA ... REPLACE):

  1. 嘗試插入新行插入表

  2. 雖然插入失敗,因爲一個對於主鍵或唯一索引發生重複鍵錯誤:

    a。從表中刪除具有重複鍵值的衝突行

    b。再次嘗試新的行插入到表

它描述INSERT ... ON DUPLICATE KEY UPDATEsimilarly

因此,只要您的REPLACEINSERT ... ON DUPLICATE KEY UPDATE命令按其當前主鍵標識您的更新記錄,它應該按照您的意願進行。按照WordPress documentation,主鍵是meta_id場,所以用SELECT你獲得這個標識符已有案例,並與外部連接,得到NULL如果它不存在(這sets the column to the next auto_increment value):

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

如果新的meta值是對每個崗位不同,你可以在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" 
; 
+0

非常感謝你的非常答案解釋和查詢的例子!我將在接下來的日子裏對此進行測試,我認爲它會解決問題。 – 2012-04-23 10:41:47