在MySQL中使用自动递增值更新行的简单方法

问题描述 投票:1回答:5

我必须将值设置为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 ;
mysql
5个回答
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 ;

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)

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


0
投票
select @i := 73;
update your_table set value = (select @i := @i + 1) 
ORDER BY name;

0
投票

要具有自动递增值,请首先分配一个变量,如下所示:

SELECT @i:=73;

现在可以在SELECT查询中增加,如下所示:

UPDATE Tablename SET somevalue = @i:=@i+1 ORDER BY name;

去检查 :

 SELECT * FROM Tablename ORDER BY name
© www.soinside.com 2019 - 2024. All rights reserved.