2017-03-01 150 views
2

我有一个表像下表。用于查询SQL UPDATE语句没有ID取ID

我需要更新每一个没有second_id线(second_id = 0)。

但是只有状态为0和second_id的每一行都是0,然后我必须使用Record的最后一行second_id中的最后一个second_id值,并将此second_id作为id并将其auto_increments添加到所有记录中second_id = 0且状态为0

在下面的表格只记录ID为5将被更新,并且second_id 6(最后second_id 5 + 1)。

这是可能仅与SQL Statment?更新后

 
+------+------------+---------+---------+--------+ 
| id | second_id | y  | z  | status | 
+------+------------+---------+---------+--------+ 
| 1 |  3 |  ja | 1  | 0 | 
| 2 |  4 |  jaa | 2  | 0 | 
| 3 |  5 |  ja | 1  | 0 | 
| 4 |  0 | jaaa | 3  | 1 | 
| 5 |  0 |  jaa | 2  | 0 | 
| 6 |  0 | aaaaa | 2  | 0 | 
+------+------------+---------+---------+--------+ 

结果:

 
+------+------------+---------+---------+--------+ 
| id | second_id | y  | z  | status | 
+------+------------+---------+---------+--------+ 
| 1 |  3 |  ja | 1  | 0 | 
| 2 |  4 |  jaa | 2  | 0 | 
| 3 |  5 |  ja | 1  | 0 | 
| 4 |  0 | jaaa | 3  | 1 | 
| 5 |  6 |  jaa | 2  | 0 | 
| 6 |  7 | aaaaa | 2  | 0 | 
+------+------------+---------+---------+--------+ 
+0

您正在使用的数据库? – Aducci

+0

我使用MySQL数据库。 –

回答

0

下面的SQL将你所问的:

MS SQL:

DECLARE @I INT = (SELECT TOP 1 SECOND_ID FROM TESTTABLE ORDER BY SECOND_ID DESC) 

UPDATE TESTTABLE 
SET SECOND_ID = @I, @I = @I + 1 
WHERE SECOND_ID = 0 AND STATUS = 0 

的MySQL:

SET @I := (SELECT second_id FROM MyTable ORDER BY second_id DESC LIMIT 1); 

UPDATE MyTable 
SET second_id = @I := @I + 1 
WHERE second_id = 0 AND status = 0; 

对于单线解决方案,创建一个存储过程。

DELIMITER $$ 

CREATE PROCEDURE RunIncrement() 
BEGIN 
DECLARE I = (SELECT second_id FROM MyTable ORDER BY second_id DESC LIMIT 1); 
UPDATE MyTable 
SET second_id = I := I + 1 
WHERE second_id = 0 AND status = 0; 
END$$ 

DELIMITER ; 

然后在需要时调用过程。

CALL RunIncrement(); 
+0

我怎样才能把它放在一个陈述?我认为这是两个声明还是? –

+0

@ wp-developer在您声明这是MySQL之前,我回答了这个问题。我现在正在处理MySQL版本。 – Ethilium

+0

@ wp-developer我更新了包含MySQL的答案。我相信这是正确的语法,但我目前无法对其进行测试。 – Ethilium