我有一张和下表一样的桌子。
我需要更新没有second_id(second_id=0)的每一行。
但只有状态为0且second_id为0的每一行,然后我必须使用具有second_id的最后一行记录中的最后一个second_id值,并将此second_id作为id,将其自动递增到second_id=0且状态为0的所有记录。
在下表中,只更新id为5的记录和第二个id为6的记录(最后一个id为5+1)。
只有SQL语句才能实现吗?
+------+------------+---------+---------+--------+
|身份证|第二身份证| y | z |身份证|
+------+------------+---------+---------+--------+
|1 | 3 |贾| 1 | 0|
|2 | 4 | jaa | 2 | 0|
|3 | 5 |贾| 1 | 0|
|4 | 0 | jaaa | 3 | 1|
|5 | 0 |贾| 2 | 0|
|6 | 0 | aaaaa | 2 | 0|
+------+------------+---------+---------+--------+
更新后的结果:
+------+------------+---------+---------+--------+
|身份证|第二身份证| y | z |身份证|
+------+------------+---------+---------+--------+
|1 | 3 |贾| 1 | 0|
|2 | 4 | jaa | 2 | 0|
|3 | 5 |贾| 1 | 0|
|4 | 0 | jaaa | 3 | 1|
|5 | 6 |贾| 2 | 0|
|6 | 7 | aaaaa | 2 | 0|
+------+------------+---------+---------+--------+

最佳答案

以下SQL将按您的要求执行:
微软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();

08-25 12:45
查看更多