2009-06-18 8 views
11

行の選択項目を0に更新する効率的な方法はありますが、IDに基づいて、MySQL:フィールドを0に設定するが、1つの行のフィールドを1に設定するすべての行を更新する

基本的には、データベースに複数のオブジェクトがあり、どちらが「不使用」であるかを切り替えたいので、クエリは行の1つ(inid = 1)をinuse = 1に設定し、残りはinuse = 0。 IDはABCDであり、そうでなければ0場合

おかげ:)

UPDATE table SET inuse=IF(id=ABCD, 1, 0) 

答えて

22
UPDATE `table` 
SET `inuse` = (`id` = 23) 
+1

これも非常にエレガントです:) –

+0

これはあなたがArtemより速く/より効率的だと思いますか? – Joel

+0

全く同じではないにしても、ほぼ同じだと思います。 –

11

確かにINUSEフィールドに1を設定します。

0
UPDATE myTable 
SET Field = 0 
WHERE FieldID <> [WhateverID] 

UPDATE myTable 
SET Field = 1 
WHERE FieldId = [WhateverID] 
0

update tbl set inuse = if(test, 1, 0); 

または短い

update tbl set inuse = test; 
例えば

update tbl set inuse = name = 'foo'; 
1
UPDATE table 
SET  inuse = (id = @id) 
WHERE id = @id 
     OR inuse 
をお試しください

これにより、関連する行のみが更新されます。

0

フラグを設定した後で、コードの他の部分が同じオブジェクトを同時に使用しない場合は、呼び出しコードがinuse = 1と設定し、完了したときにリセットする方が良いでしょう。それ以外の場合は、オブジェクト(行)を使用中としてマークする1つのスレッドを終了し、別のスレッドが別のオブジェクトを必要とする場合、使用中の最初のスレッドをリセットします。

このケースではありません、あなただけの1のためにINUSEを設定することができ、そして他のすべてをリセットし、あなたが使用することができますしたい場合:データベースがトランザクションを使用している場合、これが最善の方法

UPDATE myTable 
SET InUse = CASE 
    WHEN myTable.id = @id THEN 1 
    ELSE 0 
END 
0

です

トランザクションを使用していない場合、CASEを使用している別の回答は移植性があるため、最良のオプションです。 2つのUPDATEステートメントより多くのCPU時間が必要になります。

関連する問題