我的应用程序有一个问题,记录没有被复制从一个表说tableA到另一个表说tableB使用PHP &MYSQL。只有当主键长度为19位数字且以数字9开头时才会出现问题,并且对所有其他主键都有效。没有错误报告,进程只是复制结果失败。
我使用以下查询来复制记录-
INSERT into tableB (select * from tableA where primary_key_id=id)
查询在使用Toad/phpmyadmin手动执行时工作良好。
对于解决这个问题的任何想法或建议,我将不胜感激。
要使INSERT ... SELECT
工作,您必须提供INSERT
的列列表,或者使SELECT
输出完全匹配tableB
定义。
如果tableB
定义与tableA
完全相同,您的查询应该工作(使用INSERT
,而不是INSET
)。您也可以使用以下命令一次性创建tableB
:
CREATE TABLE tableB AS SELECT * FROM tableA ...
如果您的tableA
和tableB
确实是相同的结构,那么具有19位长主键的INSERT
可能失败的原因之一是因为您可能试图从tableA
插入重复的键到tableB
:您的INSERT
复制所有内容,包括主键值。
UPDATE:根据MySQL文档,最大BIGINT值是9,223,372,036,854,775,807
- 19位,最大值从9
开始。这听起来与你对问题的描述非常接近。我相信您只是用完了BIGINT
的最大允许值,而您想要BIGINT(20)
的事实并不能帮助您。
好的,我已经准确地找到了问题所在。在php中是一个整数溢出
当PHP遇到一个数字变得太大而无法存储在long类型中时,它将把它放入float类型。当它回显这个浮点数时,它将使用浮点符号
巧合的是,这是一个以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
按以下方式尝试:
INSERT INTO table1 ( column1 )
SELECT col1
FROM table2
你的意思是
INSERT
而非
INSET
怎么做
insert into table_name (column1, column2) values (select column3, column4 from table2 where ...)