web-dev-qa-db-ja.com

MySQL-1つのINSERTステートメントにいくつの行を挿入できますか?

値セットの数に依存しますか? INSERTステートメントのバイト数に依存しますか?

80
Luistar15

INSERT ... SELECTパターンを使用して、他のテーブルにそれらのレコードまたはその一部がある場合、無限に多数のレコードを挿入できます。

ただし、INSERT ... VALUESパターンを使用して値をハードコーディングしている場合は、ステートメントの大きさ/長さに制限があります。 max_allowed_pa​​cket クライアントによって送信されるSQLステートメントの長さを制限しますINSERTステートメントだけでなく、あらゆる種類のクエリに影響します。

88
Lukman

理想的には、Mysqlは1回の挿入で(一度に)無数の行を作成できますが、

MySQLクライアントまたはmysqldサーバーはmax_allowed_pa​​cketバイトよりも大きいパケットを受信し、Packet too largeエラーを発行して接続を閉じます。

Max_allowed_pa​​cket変数のデフォルト値を表示するには、MySQLで次のコマンドを実行します。

show variables like 'max_allowed_packet';

標準のMySQLインストールのデフォルト値は1048576バイト(1MB)です。これは、セッションまたは接続のより高い値に設定することで増やすことができます。

これにより、すべてのユーザーの値が500MBに設定されます(GLOBALの意味)。

SET GLOBAL max_allowed_packet=524288000;

新しい接続で新しいターミナルの変更を確認します。

show variables like 'max_allowed_packet';

これで、無限レコードの挿入に対してエラーなしで動作するはずです。ありがとう

35
Raju akula

クエリは一般にmax_allowed_packetによって制限されます。

20

http://forums.mysql.com/read.php?20,161869 を参照してください。これはmysqlの構成に関連しています:max_allowed_packetbulk_insert_buffer_sizekey_buffer_size

8
clark yu

1つのINSERTステートメントで無限の行を挿入できます。たとえば、INSERTクエリを実行するたびに、ループが1,000回実行されるストアドプロシージャを実行できます。

または、INSERT自体がINSERTを実行するトリガーをトリップする可能性があります。別のトリガーをトリップします。等々。

いいえ、値セットの数に依存しません。バイト数にも依存しません。

括弧のネストの深さに制限があり、ステートメント全体の長さに制限があります。これらの両方は、皮肉なことにthedailywtf.comで参照されています。ただし、上記の両方の手段でこれらの制限を回避できます。

5
Borealid

Max_allowed_pa​​cketの制限に達すると

エラー:1390準備済みステートメントに含まれるプレースホルダーが多すぎます。

1つのSQLに65535のプレースホルダーを配置できます。1つの行に2つの列がある場合、1つのSQLに32767行を挿入できます。

MySQLで50K +レコードをインポートすると一般エラーが発生する:1390準備されたステートメントに含まれるプレースホルダーが多すぎる

3
bronze man

Max_allowed_pa​​cketによって制限されます。
次を使用して指定できます:mysqld --max_allowed_packet=32Mデフォルトでは16Mです。
/etc/mysql /のmy.cnfで指定することもできます

1
linehrr

INSERTごとの挿入に制限される行の数は定義されていないと思いますが、一般的なクエリには何らかの最大サイズがあるかもしれません。

1
DMags