开发者

Multiple set and where clauses in Update query in mysql

I don't think this is possible as I couldn't find anything but I thought I would check on here in case I am not searching for the correct thing.

I have a settings table in my database which has two columns. The first column is the setting name and the second column is the value.

I need to update all of these at the same time. I wanted to see if there was a way to update these values at the same time one query like开发者_如何转开发 the following

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

I know the above isn't a correct SQL format but this is the sort of thing that I would like to do so was wondering if there was another way that this can be done instead of having to perform separate SQL queries for each setting I want to update.

Thanks for your help.


You can use INSERT INTO .. ON DUPLICATE KEY UPDATE to update multiple rows with different values.

You do need a unique index (like a primary key) to make the "duplicate key"-part work

Example:

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)

If you have a specific case I can give you the exact query.


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


I decided to use multiple queries all in one go. so the code would go like

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

etc etc

I've just done a test where I insert 1500 records into the database. Do it without starting a DB transaction and it took 35 seconds, blanked the database and did it again but starting a transaction first, then once the 1500th record inserted finish the transaction and the time it took was 1 second, so definetely seems like doing it in a db transaction is the way to go.


You need to run separate SQL queries and make use of Transactions if you want to run as atomic.


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


@Frits Van Campen,

The insert into .. on duplicate works for me. I am doing this for years when I want to update more than thousand records from an excel import.

Only problem with this trick is, when there is no record to update, instead of ignoring, this method inserts a record and on some instances it is a problem. Then I need to insert another field, then after import I have to delete all the records that has been inserted instead of update.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜