値セットの数に依存しますか? INSERT ステートメントのバイト数に依存しますか?
8 に答える
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 クエリを実行するたびに、ループが 1000 回実行されるストアド プロシージャを実行できます。
または、INSERT 自体が INSERT を実行するトリガーをトリガーする可能性があります。別のトリガーをトリップします。等々。
いいえ、値セットの数には依存しません。また、バイト数にも依存しません。
括弧のネストの深さには制限があり、ステートメント全体の長さにも制限があります。皮肉なことに、これらは両方とも thedailywtf.com で参照されています。ただし、上記の両方の手段でこれらの制限を回避できます。
INSERT ごとに挿入できる定義された行数はないと思いますが、一般的にクエリには何らかの最大サイズがあるかもしれません。
max_allowed_packet によって制限されます。
以下を使用して指定できます
mysqld --max_allowed_packet=32M
。デフォルトでは 16M です。
/etc/mysql/ の my.cnf で指定することもできます