2011-04-24 67 views
1

我不认为这是可能的,因为我找不到任何东西,但我想我会在这里检查以防万一我不寻找正确的东西。在mysql中更新查询中的多个集合和where子句

我有一个设置表在我的数据库有两列。第一列是设置名称,第二列是值。

我需要同时更新所有这些。我想看看是否有在同一时间一个查询类似以下

UPDATE table SET col1='setting name' WHERE col2='1 value' AND SET col1='another name' WHERE col2='another value'; 

我知道上面是不是一个正确的SQL格式来更新这些值的方法,但是这是诸如此类的事情,我会喜欢这样做的人想知道是否有另一种方法可以完成此操作,而不必为要更新的每个设置执行单独的SQL查询。

感谢您的帮助。

回答

1

我决定一次性使用多个查询。所以代码会是这样

UPDATE table SET col2='value1' WHERE col1='setting1'; 
UPDATE table SET col2='value2' WHERE col1='setting1'; 

等 等

我刚刚做了一个测试,我插入1500年记录到数据库中。在不启动数据库事务的情况下执行该操作,花费35秒钟,清空数据库并再次执行该操作,但首先启动事务,然后插入第1500条记录完成事务并花费1秒时间,因此definetely似乎是在执行在一个数据库交易是一条路。

+0

我徘徊这是否对数据库的性能有任何影响与在单个语句中做它? – Sam 2014-08-17 07:16:31

+0

我想它可能会稍微慢一点,因为它必须在每个语句之间进行提交,但我认为它会很小。至少我没有注意到任何性能问题 – Boardy 2014-08-18 07:33:03

+0

是的,我在考虑更多的环境,我在哪里Web服务器/数据库位于不同的服务器上工作,所以通信延迟比如果它用在Web /数据库位于同一物理硬件上的环境。 – Sam 2014-08-18 08:11:40

4

您可以使用INSERT INTO .. ON DUPLICATE KEY UPDATE更新具有不同值的多行。

你确实需要一个唯一索引(如主键)使“重复键” -part工作

例子:

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) 
    ON DUPLICATE KEY UPDATE b = VALUES(b), c = VALUES(c); 

-- VALUES(x) points back to the value you gave for field x 
-- so for b it is 2 and 5, for c it is 3 and 6 for rows 1 and 4 respectively (if you assume that a is your unique key field) 

如果你有一个特定的情况下,我可以给你确切的查询。

+0

不错的解决方案!你碰巧知道这是否比多个更新性能更好? – hardsetting 2013-12-14 22:59:05

0

如果您想以原子形式运行,则需要运行单独的SQL查询并使用事务。

0
UPDATE table SET col1=if(col2='1 value','setting name','another name') WHERE col2='1 value' OR col2='another value' 
0

@Frits凡坎彭,

的INSERT INTO ..上的重复对我的作品。 我这么做了很多年,当我想从Excel导入更新超过一千个记录时。

这个技巧的唯一问题是,当没有记录要更新时,而不是忽略,此方法插入一条记录,在某些情况下,这是一个问题。然后我需要插入另一个字段,然后导入后,我必须删除所有插入的记录,而不是更新。

2
UPDATE table 
    SET col2 = 
     CASE col1 
      WHEN 'setting1' 
      THEN 'value' 
      ELSE col2 
     END 
    , SET col1 = ... 
    ...