问题描述
|
我有下表
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`
但是为什么要这么做呢?它几乎是冗余的定义。