我必须将值设置为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 -下面的(source)给出了我的DBeaver无法正常运行的过程
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 ;
答案 0 :(得分:2)
根据您的问题,我认为如果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 ;
答案 1 :(得分:2)
在过程中执行此操作时的问题是确定要更新哪一行。您可以通过选择值= 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)
答案 2 :(得分:0)
select @i := 73;
update your_table set value = (select @i := @i + 1)
ORDER BY name;
答案 3 :(得分:0)
我们可以使用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
答案 4 :(得分:0)
要具有自动递增的值,请首先分配一个变量,如下所示:
SELECT @i:=73;
现在可以在SELECT查询中将其递增,如下所示:
UPDATE Tablename SET somevalue = @i:=@i+1 ORDER BY name;
要检查:
SELECT * FROM Tablename ORDER BY name