値セットの数に依存しますか?INSERTステートメントのバイト数に依存しますか?
回答:
INSERT ... SELECT
他のテーブルにそれらのレコードまたはその一部がある場合は、patternを使用して無限に多数のレコードを挿入できます。
ただし、INSERT ... VALUES
patternを使用して値をハードコーディングしている場合は、ステートメントの長さ/長さに制限があります。max_allowed_packetは、クライアントからデータベースサーバーに送信されるSQLステートメントの長さを制限し、あらゆるタイプのクエリに影響します。 INSERTステートメントだけではありません。
理想的には、Mysqlは1回の挿入で(一度に)無限の数の行を作成できますが、
MySQLクライアントまたはmysqldサーバーは、max_allowed_packetバイトより大きいパケットを受信すると、Packet too largeエラーを発行し、接続を閉じます。
max_allowed_packet変数のデフォルト値を表示するには、MySQLで次のコマンドを実行します。
show variables like 'max_allowed_packet';
標準のMySQLインストールのデフォルト値は1048576バイト(1MB)です。これは、セッションまたは接続に対してより高い値に設定することで増やすことができます。
これにより、すべてのユーザーの値が500MBに設定されます(これがGLOBALの意味です)。
SET GLOBAL max_allowed_packet=524288000;
新しい接続で新しい端末の変更を確認します。
show variables like 'max_allowed_packet';
これで、無限レコードの挿入に対してエラーなしで機能するはずです。ありがとう
strlen($query_with_questionmarks) < $max_alloweed_packet
ですか?
クエリはmax_allowed_packet
一般的に制限されています。
参照してくださいhttp://forums.mysql.com/read.php?20,161869、それはあなたのMySQLの設定と関連しています:max_allowed_packet
、bulk_insert_buffer_size
、key_buffer_size
。
1つのINSERTステートメントで無限の数の行を挿入できます。たとえば、INSERTクエリを実行するたびに、ループが1000回実行されるストアドプロシージャを実行できます。
または、INSERTは、それ自体がINSERTを実行するトリガーをトリップする可能性があります。これは別のトリガーを作動させます。等々。
いいえ、値セットの数には依存しません。また、バイト数にも依存しません。
括弧のネストの深さには制限があり、ステートメント全体の長さには制限があります。皮肉なことに、これらは両方ともthedailywtf.comで参照されています。ただし、上記の両方の手段でこれらの制限を回避できます。
max_allowed_packetの制限に達し、
エラー:1390プリペアドステートメントに含まれるプレースホルダーが多すぎます。
1つのSQLに65535のプレースホルダーを配置できるため、1つの行に2つの列がある場合は、1つのSQLに32767の行を挿入できます。
MySQLに50K以上のレコードをインポートすると、一般的なエラーが発生します:1390プリペアドステートメントに含まれるプレースホルダーが多すぎます