2012-11-19 75 views
-2

我有以下表结构:Mysql的帮助

状态:TINYINT

locked_by:INTEGER

日期:DATETIME

页:TINYINT

添加my_id :BIGINTEGER

主键(页,添加my_id)

,并具有以下指标:

INDEX idx_col_lock_status(locked_by,状态),

INDEX idx_my_id(添加my_id)

在某些时候,我们有以下几行:

status, locked_by, date, page, my_id 

2  243  NULL 0  1 
0  0   NULL 1  1 
1  244  NULL 2  1 
2  255  NULL 0  2 
2  2556  NULL 1  2 
2  255  NULL 2  2 

我想更新所有行(设置状态= 0,locked_by =) 有他们状态值!= 2或

他们状态值= 2 * *有

另一行与相同添加my_id有状态!= 2

经过上述更新后,上面的行应该成为。

status, locked_by, date, page, my_id 

0  0   NULL 0  1 --note this line 
0  0   NULL 1  1 
0  0   NULL 2  1 --and this line 
2  255  NULL 0  2 
2  2556  NULL 1  2 
2  255  NULL 2  2 

我正在使用Mysql版本5.1.63。

感谢

+0

是的我确定,检查更新后行应该如何。 –

回答

0

应该这样做:

CREATE TEMPORARY TABLE tt(my_id int); 
INSERT INTO tt SELECT my_id FROM yourTable WHERE status != 2); 

UPDATE yourTable yt 
SET yt.status = 0, yt.locked_by = 0 
WHERE status != 2 
OR 
(status = 2 AND EXISTS (SELECT 1 FROM tt WHERE yt.my_id = tt.my_id)); 

DROP TABLE tt; 

你必须在这里与临时表的工作,因为你不能使用同一个表的更新和子查询。