【问题标题】:MySQL: Manually increment a varchar for one insert statementMySQL:为一个插入语句手动增加一个 varchar
【发布时间】:2015-04-16 13:46:35
【问题描述】:

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

我正在编写一个插入以从源表复制到目标表,并且需要provider_no 的递增键。是否有一个函数可以返回一个插入语句的迭代?

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

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

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

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

【问题讨论】:

标签: mysql auto-increment


【解决方案1】:

要增加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 |
+-----------------------------+

抱歉,我以为您想从源表中增加 varchar 字段。

要“模拟”一个自动递增字段,我们可以使用如下变量:

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

这里有一个小演示:http://sqlfiddle.com/#!9/09fd4/1

【讨论】:

  • 啊,那是一个整洁的。但是,在源 shema 中,唯一键是(哦,天哪,我知道这很糟糕)一个两个字符的 varchar,而目标是一个 varchar,它在编程上需要是一个 int。我以前从未遇到过的一个非常独特的问题。在下面发布我的解决方案。
  • 哦,您只是想在提供程序表中插入一个新的自动递增值?
【解决方案2】:

这是我刚刚实施的解决方案。源表上有一个名为 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;

【讨论】:

  • 抱歉,我完全误解了您的要求。我修改了我的答案以完成上述操作,没有临时表。
猜你喜欢
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多