2013-04-29 59 views
0

我有一个问题,我的应用程序,这些记录不被从一个表复制说使用PHP MYSQL & TABLEA到另一个表说tableB的。 只有当主键是19位数字长并从数字开始并且适用于所有其他主键时才会出现此问题。 报告没有错误,该过程简单地无法复制结果。插入选择 - 不工作

我用下面的查询复制的记录 - 在使用蟾蜍/ phpMyAdmin的手动执行

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

查询工作正常。

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

+0

插入不INSET – 2013-04-29 09:43:41

+0

与19位我希望它只是运行了它的数据类型。 你能告诉我们一些周围的PHP吗? – nvanesch 2013-04-29 09:45:13

+0

我们需要有som代码才能给您更多的反馈。例如,代码中的id是如何分配的?实际查询如何执行? – bestprogrammerintheworld 2013-04-29 09:50:04

回答

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

+0

感谢您的回答..在我的PHP页面中,所有主要ID都被创建/用作字符串。但是在更详细的我的SQL查询是这样的$ p_id是从请求变量,即,$ p_id = $ _REQUEST ['p_id']; $ sql =“insert into tableB(select * from tableA where primary_key_id ='”。$ p_id。“')”;请建议,我想知道是否需要将$ p_id变量作为字符串转换? – KLH 2013-04-29 10:34:39

+0

我会尝试vardump p_id。看看它显示了什么。如果它显示的是问题的浮点格式,你应该对它做一个格式。如果它显示正常(你的代码会说它会,那么问题是它在数据库端的数据类型不足)(请参阅mvp答案) – nvanesch 2013-04-29 11:24:05

0

尝试以下方式:

INSERT INTO table1 (column1) 
SELECT col1 
FROM table2 
0

你的意思

INSERT 

,而不是

INSET 

在这里你可以怎么做

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

要使INSERT ... SELECT正常工作,您必须提供INSERT的列的列表,或者SELECT的输出完全匹配tableB的定义。

如果tableB的定义与tableA完全相同,那么您的查询应该有效(使用INSERT而不是INSET)。您也可以一次使用这个创造tableB

CREATE TABLE tableB AS SELECT * FROM tableA ... 

如果您tableAtableB确实是相同的结构,为什么你INSERT有19位长的主键可能会失败的原因之一是因为你可能会尝试要将tableA中的重复密钥插入tableB:您的INSERT将复制包括主键值在内的所有内容。

UPDATE:根据MySQL documentation,最大BIGINT值9,223,372,036,854,775,807 - 19位,最大值始于9。这听起来很接近你对问题的描述。我相信你只是用完了BIGINT的最大允许值,而事实上你想要BIGINT(20)不会帮你。

+0

没有重复的关键错误,是的,它复制包括主键在内的所有东西。 – KLH 2013-04-29 10:17:41

+0

@KLH:答案已更新 - 我认为您已用尽BIGINT_MAX。 – mvp 2013-04-29 10:34:01

+0

哇..这是很多记录... – webnoob 2013-04-29 10:35:58