2011-10-17 41 views
1

我有一个表中的主键是两列的组合。我想更新多个行,这取决于我的主键多个更新查询mysql

StationId ServerDate   Status 
1   2011-05-05 01:00:00 0 
1   2011-05-06 01:00:00 1 
2   2011-05-05 01:00:00 2 

我的更新查询目前看起来像

Update data set status = 1 where StationId = '1' and ServerDate = '2011-05-05 01:00:00' 
Update data set status = 2 where StationId = '1' and ServerDate = '2011-05-06 01:00:00' 

我想用CASE声明,但对如何使用它时,钥匙无法弄清楚是两个键的组合。这是我用CASE写的查询。它改变了我所有的行。如果当前记录在记录3等条件下没有出现,则其更改为默认值0.我希望该记录保留以前的值。

UPDATE data set status = CASE 
    WHEN StationId = '1' and ServerDate = '2011-05-05 01:00:00' THEN 1 
    WHEN StationId = '1' and ServerDate = '2011-05-06 01:00:00' THEN 2 
END 

回答

0

当您处理多行时,您可以使StationId更快地查询您的索引。

mysql>CREATE INDEX index_name ON tableName(StationId); 
+1

由于StationId和ServerDate是组合主键我不认为我需要索引我的StationId。我将一直使用StationId和ServerDate的组合进行搜索。而且我不想通过多个步骤进行更新。我只想使用一个查询进行更新 –

3

这是我使用CASE写的查询,但我查询了错误

END关键字后删除 “CASE”,它应该是罚款:

UPDATE data 
    SET status = 
    CASE 
     WHEN stationId = '1' and ServerDate = '2011-05-05 01:00:00' THEN 1 
     WHEN stationId = '1' and ServerDate = '2011-05-06 01:00:00' THEN 2 
     WHEN stationId = '2' and ServerDate = '2011-05-05 01:00:00' THEN 3 
    END 
WHERE stationId IN ('1', '2') 
    AND ServerDate in ('2011-05-05 01:00:00', '2011-05-06 01:00:00') 
+0

对于不存在任何WHEN情况下的记录,将其设置为默认值。我如何阻止? –

+0

您需要一个WHERE子句来限制行。查看我的编辑 –

+0

在这种情况下,如果我需要更新记录2和记录3这两个不同StationIds的记录,那我该怎么办? –

2

您的查询应为:(EDITED)

UPDATE data set status = 
(
    CASE 
     WHEN StationId = '1' AND ServerDate = '2011-05-05 01:00:00' THEN 1 
     WHEN StationId = '2' AND ServerDate = '2011-05-06 01:00:00' THEN 2 
    END 
) 
WHERE StationId IN ('1','2') 
2

你只需要删除你最后一个“CASE”

UPDATE data set status = CASE 
    WHEN StationId = '1' and ServerDate = '2011-05-05 01:00:00' THEN 1 
    WHEN StationId = '1' and ServerDate = '2011-05-06 01:00:00' THEN 2 
END 
+0

Yaa我现在已经清除了这个错误。手册位于[CASE](http://dev.mysql.com/doc/refman/5.0/en/case-statement。html)最终有CASE。现在我有另一个问题。我编辑了我的问题。看一看 –