我必须将值设置为74并将每行递增1。
+----------+--------+-----------+
| p_id | name | value |
+----------+--------+-----------+
| 1 | Ben | 0 |
| 2 | Luka | 0 |
| 3 | Frank | 0 |
| 4 | Divya | 0 |
+----------+--------+-----------+
我需要更新value
字段,如下所示
+----------+--------+-----------+
| p_id | name | value |
+----------+--------+-----------+
| 1 | Ben | 74 |
| 2 | Luka | 75 |
| 3 | Frank | 76 |
| 4 | Divya | 77 |
+----------+--------+-----------+
我尝试编写程序,但它不能在我的数据库管理应用程序 - DBeaver中工作。
有没有其他方法来获得此输出?
更新1 - 我的程序没有DBeaver工作如下(source)
DELIMITER $$
DROP PROCEDURE IF EXISTS test_mysql_while_loop$$
CREATE PROCEDURE test_mysql_while_loop()
BEGIN
DECLARE x INT;
SET x = 74;
WHILE x <= 78 DO
SET x = x + 1;
END WHILE;
END$$
DELIMITER ;
根据你的问题,我认为如果UPDATE
是主键并且可以自动增加,那么简单的p_id
将会起作用
UPDATE yourtable SET value = p_id + 73
对于您的程序,您需要使用CURSOR
DELIMITER $$
DROP PROCEDURE IF EXISTS test_mysql_while_loop$$
CREATE PROCEDURE test_mysql_while_loop()
BEGIN
DECLARE x INT;
DECLARRE t_id INT;
DECLARE curs_update CURSOR FOR SELECT p_id FROM yourtable ORDER BY p_id;
DECLARE continue HANDLER for not found set done = true;
OPEN curs_update;
read_loop:loop
IF done THEN
leave read_loop;
END IF;
fetch curs_update into t_id;
UPDATE yourtable SET value = x WHERE p_id=t_id;
SET x = x + 1;
END loop;
CLOSE curs_update;
END$$
DELIMITER ;
在过程中执行此操作时的问题是决定要更新哪一行。例如,您可以通过选择值= 0的最小行来完成此操作
drop table if exists t;
create table t( p_id int, name varchar(10), value int);
insert into t values
( 1 , 'ben' , 0),
( 2 , 'Luka' , 0),
( 3 , 'Frank', 0),
( 4 , 'Divya', 0);
drop procedure if exists p;
delimiter $$
create procedure p()
begin
DECLARE x INT;
SET x = 74;
WHILE x <= 78 DO
update t set value = x where p_id = (select minid from(select min(P_id) minid from t where value = 0) s) ;
SET x = x + 1;
END WHILE;
end $$
delimiter ;
call p();
select * from t;
+------+-------+-------+
| p_id | name | value |
+------+-------+-------+
| 1 | ben | 74 |
| 2 | Luka | 75 |
| 3 | Frank | 76 |
| 4 | Divya | 77 |
+------+-------+-------+
4 rows in set (0.00 sec)
我们可以使用select语句重置@i值。
SELECT @i:=74;
与上面的SELECT查询一样,我们将按名称更新排序:
UPDATE Mytable SET value = @i:=@i+1 ORDER BY name;
结果“SELECT * FROM Mytable ORDER BY name”
+----------+--------+-----------+
| p_id | name | value |
+----------+--------+-----------+
| 1 | Ben | 74 |
| 2 | Luka | 75 |
| 3 | Frank | 76 |
| 4 | Divya | 77 |
+----------+--------+-----------+
来源 - Link
select @i := 73;
update your_table set value = (select @i := @i + 1)
ORDER BY name;
要具有自动递增值,请首先分配一个变量,如下所示:
SELECT @i:=73;
现在可以在SELECT查询中增加,如下所示:
UPDATE Tablename SET somevalue = @i:=@i+1 ORDER BY name;
去检查 :
SELECT * FROM Tablename ORDER BY name