我的应用程序出现问题,记录没有从一个表格中复制到 tableA 到另一个表格,使用PHP&amp ;;来表示 tableB MYSQL。 仅当主键长 19位且以数字 9 开头时才会出现此问题,并且对所有其他主键都可以正常工作。 没有报告错误,该过程根本无法复制结果。
我使用以下查询来复制记录 -
INSERT into tableB (select * from tableA where primary_key_id=id)
使用 Toad / phpmyadmin 手动执行查询时工作正常。
非常感谢任何解决此问题的想法或建议。
答案 0 :(得分:1)
要使INSERT ... SELECT
生效,您必须提供INSERT
的列列表,或者SELECT
输出完全符合tableB
定义。
如果tableB
定义与tableA
完全相同,则您的查询应该有效(使用INSERT
,而不是INSET
)。您也可以使用以下方法一次创建tableB
:
CREATE TABLE tableB AS SELECT * FROM tableA ...
如果您的tableA
和tableB
确实是相同的结构,那么具有19位长主键的INSERT
可能会失败的原因之一是您可能尝试插入从tableA
到tableB
的重复密钥:您的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)
因此,您应该将主键保留为字符串,或使用数字格式器输出它。