在表的行中设置迭代值

问题描述

| 我有下表
id name address empid

1  AA   aa      0
2  BB   bb      0
3  CC   cc      0
我需要编写一个查询来设置从1开始的empid。我是否必须为此使用存储过程,或者可以使用普通查询进行存储过程? 谢谢。     

解决方法

        这是一种利用MySQL中晦涩的赋值运算符进行操作的方法。与其他一些解决方案一样,该解决方案不会在主键序列中出现空格的情况下跳过数字。
set @count = 0;
update test set empid = @count := @count+1;
这是证明:
mysql> create table test (
    -> id int unsigned primary key auto_increment,-> name varchar(32) not null,-> address varchar(32) not null,-> empid int unsigned not null default 0
    -> ) engine=innodb;
Query OK,0 rows affected (0.02 sec)

mysql> insert into test (name,address)
    -> values (\'AA\',\'aa\'),(\'BB\',\'bb\'),(\'CC\',\'cc\');
Query OK,3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from test;
+----+------+---------+-------+
| id | name | address | empid |
+----+------+---------+-------+
|  1 | AA   | aa      |     0 |
|  2 | BB   | bb      |     0 |
|  3 | CC   | cc      |     0 |
+----+------+---------+-------+
3 rows in set (0.00 sec)

mysql> set @count=0;
Query OK,0 rows affected (0.00 sec)

mysql> update test set empid = @count := @count+1;
Query OK,3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> select * from test;
+----+------+---------+-------+
| id | name | address | empid |
+----+------+---------+-------+
|  1 | AA   | aa      |     1 |
|  2 | BB   | bb      |     2 |
|  3 | CC   | cc      |     3 |
+----+------+---------+-------+
3 rows in set (0.00 sec)
    ,        如果您希望在第一行中将1放在Empid中,在第二行中将2放在等等,最简单的方法是使用已经在执行此操作的id字段,如下所示:
UPDATE table
SET empid = id
您唯一需要担心的是id列中缺少数字。如果那是一个问题,并且您缺少ID号,则必须使用其他方法。为此,您需要执行以下操作:
DECLARE @counter int
SET @counter = 1
UPDATE table
SET @counter = empid = @counter + 1
    ,        正如@BiggsTRC建议的那样,您可以使用id设置为empid。如果没有,您可以创建存储过程或一些PHP代码来实现。 如果您的ID不是\“ AutoIncrement \”字段,则可以将新列视为autoincrement字段,并使用更新查询将该值分配给emp,然后删除该新列。 (这些是一些备选方案,您需要选择最佳方案)     ,        
          UPDATE `test` SET `empid`=`id`
但是为什么要这么做呢?它几乎是冗余的定义。