0

我的应用程序有问题,没有使用 PHP 和 MYSQL将记录从一个表说tableA复制到另一个表说tableB 。仅当主键长度为19 位并且以数字9开头并且适用于所有其他主键时,才会出现此问题。没有报告错误,该过程根本无法复制结果。

我使用以下查询来复制记录 -

INSERT into tableB (select * from tableA where primary_key_id=id)

使用Toad / phpmyadmin手动执行查询时工作正常。

任何解决此问题的想法或建议将不胜感激。

4

4 回答 4

1

为了INSERT ... SELECT工作,您必须为 提供列列表INSERT,或者使SELECT输出与tableB定义完全匹配。

如果tableB定义与 完全相同tableA,则您的查询应该可以工作(使用INSERT,而不是INSET)。您也可以tableB使用以下命令一次创建:

CREATE TABLE tableB AS SELECT * FROM tableA ...

如果您的tableAtableB确实是相同的结构,那么您INSERT的 19 位长主键可能会失败的原因之一是因为您可能试图将重复的键从: 您的副本中tableA插入所有内容,包括主键值。tableBINSERT

更新:根据MySQL 文档,最大 BIGINT 值为9,223,372,036,854,775,807- 19 位,最大值以9. 这听起来很接近您对问题的描述。我相信您只是用完了 的最大允许值BIGINT,而您想要的事实对您BIGINT(20)没有帮助。

于 2013-04-29T09:45:22.410 回答
0

尝试以下方式:

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2
于 2013-04-29T09:43:33.497 回答
0

你的意思是

 INSERT

并不是

INSET

在这里你怎么做

insert into table_name (column1, column2) values (select column3, column4 from table2 where ...)
于 2013-04-29T09:43:56.590 回答
0

好的,我已经准确定位了问题.. 它是 php 中的整数溢出。

当 PHP 遇到一个太大而无法长时间存储的数字时,它将把它放在一个浮点数中。当它回显该浮点数时,它将使用浮点数表示法。

巧合的是,它是一个以 9 开​​头的 19 位数字,它开始出错。

$large_number = 9223372036854775807;
var_dump($large_number);                     // int(9223372036854775807)

$large_number = 9223372036854775808;
var_dump($large_number);                     // float(9.2233720368548E+18)

因此,您应该将主键保留为字符串或使用数字格式化程序来输出它。

来源: http: //php.net/manual/en/language.types.integer.php

于 2013-04-29T10:20:02.197 回答