使用代码递增列中的值

问题描述

我正在尝试使用一个简单的代码来仅递增表的“ 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
    )
;