【问题标题】:How to backfill an auto increment field in MySQL如何回填 MySQL 中的自动增量字段
【发布时间】:2016-09-29 04:38:15
【问题描述】:

我有一个连接到 SuiteCRM 的 MySQL 数据库 5.6.32。我正在使用一个插件,该插件无需任何编码即可创建自动增量字段。

我面临的挑战是,在我们的系统中已经有数据记录之后,我创建了这个自动增量字段。我需要使用自动增量值更新所有以前的条目。

当我创建新记录时,自动增量字段可以正常工作,但我需要所有记录的唯一编号,因为它被用作唯一标识符,并且系统中的默认 ID 太长而无法使用。

它在MySQL数据库中创建的自增字段类型如下:

#   Name                Type        Collation               Null    Default
10  customer_number_c   varchar(80) utf8_general_ci         Yes     NULL

这是我迄今为止尝试填充该字段的方法:

 UPDATE `suitecrm`.`accounts_cstm` SET `customer_number_c` = auto_increment

结果是:

错误 #1054 -“字段列表”中的未知列“AUTO_INCNREMENTAL”

该字段也已经有一个默认值NULL

【问题讨论】:

    标签: mysql


    【解决方案1】:

    MySQL 的内置自动增量功能仅适用于整数数据类型的列。你的是 varchar(80)。我不确定你为什么这样做,但我认为这是故意的。

    您可以使用会话变量来填充客户编号。当您分配值时,它会将会话变量的整数值隐式转换为字符串表示形式。

    SET @num := 0;
    
    UPDATE suitecrm.accounts_cstm 
    SET customer_number_c = (@num := @num + 1) 
    ORDER BY ...;
    

    您必须指定一些 ORDER BY 子句以确保按您希望的顺序分配递增的值。

    但您仍然无法在 customer_number_c 列上使用AUTO_INCREMENT。因此,您的应用必须在向该表插入新行之前生成新的客户编号值。

    【讨论】:

    • BIll,谢谢您的指导。这完成了我需要完成的工作。你是对的,应用程序在数据库之外完成了自动增量并将所需的值放在字段中。对于任何想知道的人,我将 ORDER BY 设置为:ORDER BY customer_number_c ASC;
    【解决方案2】:

    如果您添加一个auto_increment 主键,MySQL 将为您追溯填充现有行。我刚刚使用以下测试代码验证了这一点:

    mysql> create table mytable (name varchar(32)) engine=innodb;
    Query OK, 0 rows affected (0.04 sec)
    
    mysql> insert into mytable (name) values ('miles'), ('trane'), ('monk');
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> select * from mytable;
    +-------+
    | name  |
    +-------+
    | miles |
    | trane |
    | monk  |
    +-------+
    3 rows in set (0.00 sec)
    
    mysql> alter table mytable add column id int unsigned primary key auto_increment first;
    Query OK, 0 rows affected (0.04 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> select * from mytable;
    +----+-------+
    | id | name  |
    +----+-------+
    |  1 | miles |
    |  2 | trane |
    |  3 | monk  |
    +----+-------+
    3 rows in set (0.00 sec)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-24
      • 2013-05-21
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多