如何回填MySQL

时间:2016-09-28 19:56:42

标签: mysql

我有一个连接到SuiteCRM的MySQL数据库5.6.32。我使用的插件允许创建自动增量字段而无需任何编码。

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

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

它在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

结果是:

  

ERROR#1054 - “字段列表”中的未知列'AUTO_INCNREMENTAL'

该字段中也包含默认值NULL

2 个答案:

答案 0 :(得分: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。因此,在将新行插入此表之前,您的应用必须生成新的客户编号值。

答案 1 :(得分:1)

如果添加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)