REPLACE
和INSERT ... ON DUPLICATE KEY UPDATE
是不「相關僅是唯一的或定義主鍵列」,而確定記錄是新的還是已經存在的(並且因此需要被替換/更新)是否存在唯一的密鑰衝突。由於MySQL documentation狀態:
MySQL使用以下算法REPLACE
(和LOAD DATA ... REPLACE
):
嘗試插入新行插入表
雖然插入失敗,因爲一個對於主鍵或唯一索引發生重複鍵錯誤:
a。從表中刪除具有重複鍵值的衝突行
b。再次嘗試新的行插入到表
它描述INSERT ... ON DUPLICATE KEY UPDATE
similarly。
因此,只要您的REPLACE
或INSERT ... 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"
;
非常感謝你的非常答案解釋和查詢的例子!我將在接下來的日子裏對此進行測試,我認爲它會解決問題。 – 2012-04-23 10:41:47