我有下表
id name address empid
1 AA aa 0
2 BB bb 0
3 CC cc 0
我需要编写一个查询来设置empid从1开始。请如何编写它。我是否必须使用存储过程或使用普通查询来执行此操作?
谢谢。
答案 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`
但你为什么要这样做呢?这几乎是冗余的定义。