2012-08-24 109 views
1

這個問題有些關於「最佳實踐」,但也是一個潛在問題的搜索。我希望能夠在多個字段上運行更新並分配不同的值,而無需運行多個查詢並且不使用超級複雜查詢。所以,我所做的是創建一個主鍵和「名稱」列作爲唯一鍵的表。插入重複密鑰更新作爲替代更新

現在,當我想用​​不同的值更新多列,我可以運行這樣的查詢:

INSERT INTO my_table (name, description) VALUES ('name', 'mydescription'), ('name2', 'description2') ON DUPLICATE KEY UPDATE description = VALUES(description) 

這是一個壞主意?有一個更好的方法嗎?標準警察是否會逮捕我?


編輯:我只是注意到一個潛在的問題,作爲一個競爭條件。如果一個用戶在另一個用戶正在編輯它時刪除了一行,並且他們保存了該信息,那麼編輯將重新創建該行。 (這可以作爲一個功能或一個錯誤。)

+0

參見[性能問題::ON DUPLICATE密鑰更新VS UPDATE(MySQL的)] -table UPDATE語法與表使用從UNION物化常數(http://stackoverflow.com/questions/5036051/performance-問題上,重複鍵更新-VS-更新MySQL的)。 – eggyal

+0

這是一個類似的問題,但我更多地詢問這是否允許。我並不擔心在這種情況下的表現(我知道,我知道),因爲該應用程序被包含並限制使用。但是有沒有簡單的選擇?用'update'做這件事的唯一方法是使用'UPDATE'來處理一個有點難看的案例。 – teynon

+0

它的工作原理非常簡潔。看到我的答案下面的替代。 – eggyal

回答

2

my comment above(鏈接到另一個海報使用INSERT ... ON DUPLICATE KEY UPDATE其中記錄已知存在的對性能的影響建議的一個問題),可以使用多

UPDATE my_table JOIN (
    SELECT 'name' AS name, 'mydescription' AS description 
    UNION ALL 
    SELECT 'name2', 'description2' 
) t USING (name) SET my_table.description = t.description 
+0

儘管我討厭承認......我不太確定這裏發生了什麼......這是一個看似複雜的查詢,而我試圖保持簡單和可維護性。 – teynon

+0

@Tom:你只是從由'UNION'組合的兩個'SELECT '語句組成的子查詢創建一個表't';然後將該表加入'my_table',其中'name'列匹配並根據需要更新'description'列。如果你不關心性能,並且覺得這種方法太複雜,那麼使用'INSERT ... ON DUPLICATE KEY UPDATE'的原始方法可能是最好的方法。 – eggyal

+0

我如何通過這種方法添加多列? – teynon