2012-08-24 77 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