问题描述
我正在尝试使用一个简单的代码来仅递增表的“ chat_id”列中的值。
对于表lz_chat_archive_dup1,列“ chat_id”具有空字符串(无值)。这是该表的部分摘录:
<p:inputMask inputStyleClass="#{(newDesWeb eq '_')? 'selectfile' : 'form-control lg200 input-sm'} errorCible"
id="zoneResidenceAssure" styleClass="#{(newDesWeb eq '_')? 'ng-pristine ng-invalid ng-touched' : ''} errorCible"
style="width: 100%"
value="#{devisPresBean.currentAssureDevisBean.adresseActuelle.zipCode}" maxlength="#{msg['form.control.input.codepostal.maxlength']}">
<c:ajax onevent="displayAjaxSatus" event="change" execute="@this" render="@this" />
<p:keyFilter regEx="[0-9]" for="zoneResidenceAssure" />
</p:inputMask>
我试图像这样插入名称“ Yw”的值,并且有效:
MysqL> select chat_id,fullname from lz_chat_archive_dup1 LIMIT 5;
+---------+--------------+
| chat_id | fullname |
+---------+--------------+
| | Yw |
| | Shah |
| | Sunny Duhel |
| | Leong Zi Yin |
| | Mohd Nasir |
+---------+--------------+
5 rows in set (0.00 sec)
所以现在的表是这样的:
MysqL> UPDATE lz_chat_archive_dup1 SET chat_id = '383933' where fullname = 'Yw';
Query OK,1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
但是,此表中的行数为2589,对我而言,一一做起来既繁琐又耗时:
MysqL> select chat_id,fullname from lz_chat_archive_dup1 LIMIT 5;
+---------+--------------+
| chat_id | fullname |
+---------+--------------+
| 383933 | Yw |
| | Shah |
| | Sunny Duhel |
| | Leong Zi Yin |
| | Mohd Nasir |
+---------+--------------+
5 rows in set (0.00 sec)
我认为我可以使用类似这样的代码来仅更新/增加该列,但是我认为这不是MysqL的正确语法。您能帮忙更正代码以自定义它以适合我的情况吗?
MysqL> select count(*) from lz_chat_archive_dup1;
+----------+
| count(*) |
+----------+
| 2589 |
+----------+
1 row in set (0.00 sec)
因此,使用此代码,我要实现的目标是递增chat_id列,以便下一个值始终比上一个值高1个整数。因此,第一行是383933,下一行应该是383934、383935、383936等。
该表具有> 2000行,因此这是它的摘录:
DECLARE @counter int
SET @counter = 383933
UPDATE #lz_chat_archive_dup1
SET @counter = counter = @counter + 1
解决方法
以下是使用用户变量的方法:
set @rn = 383933;
update #lz_chat_archive_dup1
set chat_id = (select @rn := @rn + 1)
order by name;
这将按照name
的字母顺序为每行分配一个递增的n号。如果有联系,则不确定哪个名称将获得哪个号码(这就是为什么您的表中应具有主键列的原因)。
假设名称是唯一的,您可以使用join
:
update lz_chat_archive_dup1 cad join
(select cad2.*,row_number() over () as seqnum
from lz_chat_archive_dup1 cad2
) cad2
on cad2.name = cad.name
set count = seqnum + 383933;
我认为这可能是MySQL 8+中推荐的方法。 (关于变量不赞成使用的声明对于它是否适用于UPDATE
有点含糊。)
您也可以使用变量。您的陈述的问题是:
SET @counter = counter = @counter + 1
这甚至没有在表格中设置列!它正在设置一个变量。使用:=
设置参数。我强烈建议使用括号。因此,您可以这样做:
DECLARE @counter int;
SET @counter = 383933;
UPDATE #lz_chat_archive_dup1
SET counter = (@counter := @counter + 1);
或者,在一个语句中:
UPDATE #lz_chat_archive_dup1 cad CROSS JOIN
(SELECT @counter := 383933) params
SET cad.counter = (@counter := @counter + 1);
,
如果您可以按照fullname
列的字母顺序使用从1开始的数字,则可以尝试使用helper表来运行更新:
CREATE TABLE updtab
AS
SELECT
ROW_NUMBER() OVER(ORDER BY fullname) AS chat_id,fullname
FROM lz_chat_archive_dup1;
然后,运行更新:
UPDATE lz_chat_archive_dup1
SET chat_id = (
SELECT chat_id
FROM updtab
WHERE updtab.fullname=lz_chat_archive_dup1.fullname
)
;