我正在尝试将数据从一个表插入另一个表,每个表都有一个“ id”字段,该字段应该相同,但存储的数据类型不同。此“ id”字段应代表相同的唯一值,允许我从一个更新到另一个。
在一个表(新表)中,“ id”以数据类型varchar(35)
存储,在old.table中,数据类型为bigint(20)
-我相信这个旧表代表存储在新值中的十六进制值的整数版本。我正在尝试将数据从new.table更新回old.table
搜索了一段时间后
当我尝试这个简单的mysql更新查询时,它失败了:
INSERT INTO old.table (id, field2)
SELECT CAST(CONV(id,16,10) AS UNSIGNED INTEGER), field2
FROM new.table;
由于以下错误而失败:
Out of range value for column 'id' at row 1
我也尝试了一个简单的
SELECT CAST(CONV(id, 16,10) AS UNSIGNED INTEGER) from new.table;
结果大部分都是相同的整数,但是new.table中的每个十六进制值都是唯一的。我已经在Google上搜索了两天,它确实可以帮助您找出问题所在。谢谢。
编辑:来自new.table的SELECT ID输出的控制台中的一些示例数据:
| 1d2353560110956e1b3e8610a35d903a |
| ec526762556c4f92a3ea4584a7cebfe1.11 |
| 34b8c838c18a4c5690514782b7137468.16 |
| 1233fa2813af44ca9f25bb8cac05b5b5.16 |
| 37f396d9c6e04313b153a34ab1e80304.16 |
答案 0 :(得分:0)
问题id
的值太高。
MySQL
将在发生溢出时返回极限值。
查询1 :
select CONV('FFFFFFFFFFFFFFFF1',16,10)
Results :
| CONV('FFFFFFFFFFFFFFFF1',16,10) |
|---------------------------------|
| 18446744073709551615 |
查询2 :
select CONV('FFFFFFFFFFFFFFFF',16,10)
Results :
| CONV('FFFFFFFFFFFFFFFF',16,10) |
|--------------------------------|
| 18446744073709551615 |
我建议您在函数中为id
实现逻辑算法,而不要使用CONV
函数。
编辑
我将使用变量创建新的行号并插入到old
表中。
CREATE TABLE new(
Id varchar(35)
);
insert into new values ('1d2353560110956e1b3e8610a35d903a');
insert into new values ('ec526762556c4f92a3ea4584a7cebfe1.11');
insert into new values ('34b8c838c18a4c5690514782b7137468.16');
insert into new values ('1233fa2813af44ca9f25bb8cac05b5b5.16');
insert into new values ('37f396d9c6e04313b153a34ab1e80304.16');
CREATE TABLE old(
Id bigint(20),
val varchar(35)
);
INSERT INTO old (id, val)
SELECT rn, id
FROM (
SELECT *,(@Rn:=@Rn +1) rn
FROM new CROSS JOIN (SELECT @Rn:=0) v
) t1
查询1 :
SELECT * FROM old
Results :
| Id | val |
|----|-------------------------------------|
| 1 | 1d2353560110956e1b3e8610a35d903a |
| 2 | ec526762556c4f92a3ea4584a7cebfe1.11 |
| 3 | 34b8c838c18a4c5690514782b7137468.16 |
| 4 | 1233fa2813af44ca9f25bb8cac05b5b5.16 |
| 5 | 37f396d9c6e04313b153a34ab1e80304.16 |