在表的行中设置迭代值

时间:2011-06-15 03:27:55

标签: mysql sql database

我有下表

id name address empid

1  AA   aa      0
2  BB   bb      0
3  CC   cc      0

我需要编写一个查询来设置empid从1开始。请如何编写它。我是否必须使用存储过程或使用普通查询来执行此操作?

谢谢。

4 个答案:

答案 0 :(得分:5)

这是一种利用pretty obscure assignment operator in 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 :(得分:0)

如果你想在第一行中使用emp,在第二行中使用2,等等,最简单的方法是使用你已经这样做的id字段:

UPDATE table
SET empid = id

您唯一需要担心的是id列中缺少数字。如果这是一个问题并且您缺少ID号,则必须使用其他方法。要做到这一点,你需要做这样的事情:

DECLARE @counter int
SET @counter = 1
UPDATE table
SET @counter = empid = @counter + 1

答案 2 :(得分:0)

由于@BiggsTRC建议您可以使用id来设置empid。如果没有,您可以创建存储过程或一些PHP代码来执行此操作。 如果您的ID不是“自动增量”字段,则可以将新列视为自动增量字段,并使用更新查询将该值分配给emp,然后删除该新列。 (这些是替代品,你需要选择最好的一个)

答案 3 :(得分:0)

          UPDATE `test` SET `empid`=`id`

但你为什么要这样做呢?这几乎是冗余的定义。