値セットの数に依存しますか? INSERTステートメントのバイト数に依存しますか?
INSERT ... SELECT
パターンを使用して、他のテーブルにそれらのレコードまたはその一部がある場合、無限に多数のレコードを挿入できます。
ただし、INSERT ... VALUES
パターンを使用して値をハードコーディングしている場合は、ステートメントの大きさ/長さに制限があります。 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';
これで、無限レコードの挿入に対してエラーなしで動作するはずです。ありがとう
クエリは一般に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クエリを実行するたびに、ループが1,000回実行されるストアドプロシージャを実行できます。
または、INSERT自体がINSERTを実行するトリガーをトリップする可能性があります。別のトリガーをトリップします。等々。
いいえ、値セットの数に依存しません。バイト数にも依存しません。
括弧のネストの深さに制限があり、ステートメント全体の長さに制限があります。これらの両方は、皮肉なことにthedailywtf.comで参照されています。ただし、上記の両方の手段でこれらの制限を回避できます。
Max_allowed_packetの制限に達すると
エラー:1390準備済みステートメントに含まれるプレースホルダーが多すぎます。
1つのSQLに65535のプレースホルダーを配置できます。1つの行に2つの列がある場合、1つのSQLに32767行を挿入できます。
MySQLで50K +レコードをインポートすると一般エラーが発生する:1390準備されたステートメントに含まれるプレースホルダーが多すぎる
Max_allowed_packetによって制限されます。
次を使用して指定できます:mysqld --max_allowed_packet=32M
デフォルトでは16Mです。
/etc/mysql /のmy.cnfで指定することもできます
INSERTごとの挿入に制限される行の数は定義されていないと思いますが、一般的なクエリには何らかの最大サイズがあるかもしれません。