MySQL:为一个插入语句手动递增一个varchar

MySQL: Manually increment a varchar for one insert statement

我正在将数据从一个数据库转换到另一个数据库。目标数据库有一个名为 table 的提供者,主键为 provider_no varchar(6).

我正在编写一个插入以从源 table 复制到目标 table,并且需要 provider_no 的递增密钥。是否有一个函数 return 甚至是一个插入语句的迭代?

还有很多专栏,但我要解决的基本问题是:

INSERT INTO `target`.`provider`
  (`provider_no`,
  `lastUpdateDate`)
SELECT 
  '', --incremented value
  now()
from `source`.`provider`;

自动递增仅适用于 int 值,但我不能随意更改数据类型。

此外,源 table 没有可用于此副本的可用主键值。

要增加 varchar,首先 cast 将它变成一个数字(signedunsigned),如下所示:

INSERT INTO `target`.`provider`
  (`provider_no`,
  `lastUpdateDate`)
SELECT 
  cast(the_varchar_field as signed) + 1, --incremented value
  now()
from `source`.`provider`;

示例:

mysql> select cast("001" as unsigned) + 1;
+-----------------------------+
| cast("001" as unsigned) + 1 |
+-----------------------------+
|                           2 |
+-----------------------------+

抱歉,我以为你想增加来自源 table 的 varchar 字段。

要'emulate'一个你想做的自增字段,我们可以用这样的变量来做:

insert into provider 
  select @cnt := @cnt +1, now()
    from sourceprovider, (select @cnt := 0) q;

下面是一个小演示:http://sqlfiddle.com/#!9/09fd4/1

这是我刚刚实施的解决方案。源 table 上有一个名为 did 的独特列,我可以间接使用它。可能有更优雅的方法,但是:

create table temp_key (
key_id int auto_increment primary key,
did varchar(4));

insert into temp_key (did) select did from source.provider;

INSERT INTO target.provider
  (provider_no,
  lastUpdateDate)
SELECT
  k.key_id,
  now()
FROM source.provider d
JOIN temp_key k on d.did = k.did;


drop table temp_key;