插入选择-不工作


Insert into select - not working

我的应用程序有一个问题,记录没有被复制从一个表说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 ...

如果您的tableAtableB确实是相同的结构,那么具有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 ...)