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


91

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

回答:


93

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

ただし、INSERT ... VALUESpatternを使用して値をハードコーディングしている場合は、ステートメントの長さ/長さに制限があります。max_allowed_pa​​cketは、クライアントからデータベースサーバーに送信されるSQLステートメントの長さを制限し、あらゆるタイプのクエリに影響します。 INSERTステートメントだけではありません。


44

理想的には、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';

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


11
500MBは無限ではありません。デフォルト値よりもはるかに大きいですが、それでも無限ではありません。
Carlos2W 2016年

質問:この制限は正確には何ですか?クエリ自体?データについてはどうですか、ステートメントを実行するときにバインドしますか?まで、私は安全strlen($query_with_questionmarks) < $max_alloweed_packetですか?
pilat 2018年

可能な最大値、つまり1GBに設定しようとした場合、次のようになります。SETGLOBAL max_allowed_pa​​cket = 1073741824
PHP Guru



6

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

または、INSERTは、それ自体がINSERTを実行するトリガーをトリップする可能性があります。これは別のトリガーを作動させます。等々。

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

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


あなたの例では、複数のINSERTを実行するためのもので、それが中に複数の行を挿入については示していない1つのINSERT文...
ルクマン

@Lukman:1つのINSERTクエリにより、複数のINSERTがデータベースにヒットする可能性があります。誰が何を数えているのかだけです。
borealid 2010

2
確かにそうですが、最初の例は、各ループが1つのINSERTステートメントを実行するループでクエリを実行することを示しており、1つのINSERTステートメントが複数の行を挿入することについては何も述べていません。それは強調の問題です。
ラックマン2010

誰も無限のことはできません。リソースの制限は常にあります。
エイドリアン2017年

これはSELECT ... FROMステートメントにも当てはまりますか?そもそもmax_allowed_pa​​cketでデータが挿入されているのなら、その後もこれを選択するのではないでしょうか。とにかく最初に挿入する必要があるときに他のポスターが言ったように、他のすべてのステートメントに適用される理由がわかりません。
Thielicious

6

max_allowed_pa​​cketの制限に達し、

エラー:1390プリペアドステートメントに含まれるプレースホルダーが多すぎます。

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

MySQLに50K以上のレコードをインポートすると、一般的なエラーが発生します:1390プリペアドステートメントに含まれるプレースホルダーが多すぎます


2

INSERTごとに挿入できる行数は定義されていないと思いますが、一般にクエリにはある種の最大サイズがある可能性があります。


2

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.