MySQL-하나의 INSERT 문에 몇 개의 행을 삽입 할 수 있습니까?


92

값 세트의 수에 따라 달라 집니까? INSERT 문의 바이트 수에 따라 달라 집니까?

답변:


94

INSERT ... SELECT다른 테이블에 해당 레코드 또는 일부가있는 경우 패턴을 사용하여 무한히 많은 수의 레코드를 삽입 할 수 있습니다 .

그러나 INSERT ... VALUES패턴을 사용하여 값을 하드 코딩하는 경우 명령문의 크기 / 길이에 제한 이 있습니다. max_allowed_packet 클라이언트가 데이터베이스 서버로 보내는 SQL 문의 길이를 제한하고 모든 유형의 쿼리에 영향을줍니다. INSERT 문뿐만 아니라


45

이상적으로 Mysql은 단일 삽입 (한 번에)에서 무한한 수의 행 생성을 허용하지만

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';

이제 무한 레코드 삽입에 대해 오류없이 작동합니다. 감사


12
500MB는 무한하지 않습니다. 기본값보다 훨씬 크지 만 여전히 무한하지는 않습니다.
Carlos2W

질문 :이 제한은 정확히 무엇입니까? 쿼리 자체? 문을 실행할 때 데이터, 바인딩은 어떻습니까? 나는 안전 할 수 있습니까 strlen($query_with_questionmarks) < $max_alloweed_packet?
PILAT

가능한 가장 큰 값으로 설정하려는 경우 1GB는 다음과 같습니다. SET GLOBAL max_allowed_packet = 1073741824
PHP Guru




6

하나의 INSERT 문으로 무한한 수의 행을 삽입 할 수 있습니다. 예를 들어 INSERT 쿼리를 실행할 때마다 루프가 천 번 실행되는 저장 프로 시저를 실행할 수 있습니다.

또는 INSERT는 자체적으로 INSERT를 수행하는 트리거를 트립 할 수 있습니다. 다른 트리거를 작동시킵니다. 등등.

아니요, 값 집합의 수에 의존하지 않습니다. 또한 바이트 수에도 의존하지 않습니다.

괄호의 중첩 깊이에는 제한이 있고 전체 문의 길이에는 제한이 있습니다. 이 두 가지 모두 역설적이게도 thedailywtf.com에서 참조됩니다. 그러나 위에서 언급 한 두 가지 방법 모두 이러한 한계를 극복합니다.


귀하의 예는 여러 INSERT를 실행하고, 그것에서 여러 행을 삽입하는 방법에 대한 표시하지 않습니다 하나의 INSERT 문 ..
루크

@Lukman : 하나의 INSERT 쿼리로 인해 여러 INSERTS가 데이터베이스에 도달 할 수 있습니다. 누가 무엇을 세 느냐의 문제입니다.
Borealid

2
사실이지만 첫 번째 예제는 각 루프가 하나의 INSERT 문을 실행하는 루프에서 쿼리를 실행하는 방법을 보여 주며 여러 행을 삽입하는 하나의 INSERT 문에 대해서는 아무것도 말하지 않습니다. 그것은 단지 강조의 문제입니다.
Lukman

아무도 무한한 것을 할 수 없습니다. 항상 리소스 제한이 있습니다.
Adrien 2017 년

SELECT ... FROM 문에도 적용됩니까? 내 말은 max_allowed_packet으로 데이터가 처음에 삽입 되었다면 이것도 그 후에 선택해야하지 않습니까?. 어쨌든 다른 포스터보다 먼저 삽입해야 할 때 다른 포스터가 말한 것처럼 다른 모든 진술에 왜 적용되는지 이해하지 못합니다.
Thielicious

2

INSERT 당 삽입으로 제한되는 행 수가 정의되어 있지 않지만 일반적으로 쿼리에 대한 최대 크기가있을 수 있습니다.


2

max_allowed_packet에 의해 제한됩니다.
다음을 사용하여 지정할 수 있습니다 mysqld --max_allowed_packet=32M . 기본값은 16M입니다.
/ etc / mysql /의 my.cnf에서 지정할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.