0

私のアプリケーションに問題があります。レコードは、PHP と MYSQL を使用して、あるテーブル ( tableAなど)から別のテーブル(tableB など)にコピーされていません。この問題は、主キーの長さが19 桁で、数字9で始まる場合にのみ発生し、他のすべての主キーで正常に機能します。エラーは報告されません。プロセスは単に結果のコピーに失敗します。

次のクエリを使用してレコードをコピーします-

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

Toad / phpmyadminを使用して手動で実行すると、クエリは正常に機能します。

これを解決するためのアイデアや提案は大歓迎です。

4

4 に答える 4

1

が機能するにはINSERT ... SELECT、 の列のリストを提供するか、定義と正確に一致する出力をINSERT持たなければなりません。SELECTtableB

tableB定義が とまったく同じである場合tableA、クエリは機能するはずです (INSERTではなくを使用INSET)。tableBこれを使用して一度に作成することもできます。

CREATE TABLE tableB AS SELECT * FROM tableA ...

tableAとが実際に同じ構造である場合、19 桁の長い主キーが失敗するtableB理由の 1 つは、 からに重複したキーを挿入しようとしている可能性があるためです。主キーの値を含むすべてをコピーします。INSERTtableAtableBINSERT

更新: MySQL のドキュメントによると、最大 BIGINT 値は9,223,372,036,854,775,807-19 桁で、最大値は で始まります9。これは、問題の説明に疑わしいほど近いようです。の最大許容値を使い果たしているだけでBIGINTあり、必要な事実BIGINT(20)は役に立たないと思います。

于 2013-04-29T09:45:22.410 に答える
0

次の方法で試してください。

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2
于 2013-04-29T09:43:33.497 に答える
0

ということですか

 INSERT

ではない

INSET

ここであなたはそれを行うことができます

insert into table_name (column1, column2) values (select column3, column4 from table2 where ...)
于 2013-04-29T09:43:56.590 に答える
0

OK、私は問題を正確に特定しました..それはphpの整数オーバーフローです.

大きくなりすぎて long に格納できない数値に遭遇すると、PHP はその数値を float に入れます。そのfloatをエコーするときは、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

于 2013-04-29T10:20:02.197 に答える