插入选择 - 不工作

时间:2013-04-29 09:41:52

标签: php mysql

我的应用程序出现问题,记录没有从一个表格中复制到 tableA 到另一个表格,使用PHP&amp ;;来表示 tableB MYSQL。 仅当主键长 19位且以数字 9 开头时才会出现此问题,并且对所有其他主键都可以正常工作。 没有报告错误,该过程根本无法复制结果。

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

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

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

非常感谢任何解决此问题的想法或建议。

4 个答案:

答案 0 :(得分:1)

要使INSERT ... SELECT生效,您必须提供INSERT的列列表,或者SELECT输出完全符合tableB定义。

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

CREATE TABLE tableB AS SELECT * FROM tableA ...

如果您的tableAtableB确实是相同的结构,那么具有19位长主键的INSERT可能会失败的原因之一是您可能尝试插入从tableAtableB的重复密钥:您的INSERT复制所有内容,包括主键值。

更新:根据MySQL documentation,最大BIGINT值为9,223,372,036,854,775,807 - 19位,最大值以9开头。这听起来非常接近您对问题的描述。我认为您的BIGINT的最大允许值不足,而您希望BIGINT(20)无法帮助您。

答案 1 :(得分:0)

尝试以下方式:

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2

答案 2 :(得分:0)

你是说

吗?
 INSERT

而不是

INSET

这里你怎么做呢

insert into table_name (column1, column2) values (select column3, column4 from table2 where ...)

答案 3 :(得分:0)

好的,我确切地找到了问题..它是php中的整数溢出。

当PHP遇到一个太长而无法存储的数字时,它会把它放在一个浮点数中。当它回显浮动时,它将使用浮动符号。

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

$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