값 세트의 수에 따라 달라 집니까? INSERT 문의 바이트 수에 따라 달라 집니까?
답변:
INSERT ... SELECT
다른 테이블에 해당 레코드 또는 일부가있는 경우 패턴을 사용하여 무한히 많은 수의 레코드를 삽입 할 수 있습니다 .
그러나 INSERT ... VALUES
패턴을 사용하여 값을 하드 코딩하는 경우 명령문의 크기 / 길이에 제한 이 있습니다. max_allowed_packet 클라이언트가 데이터베이스 서버로 보내는 SQL 문의 길이를 제한하고 모든 유형의 쿼리에 영향을줍니다. INSERT 문뿐만 아니라
이상적으로 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';
이제 무한 레코드 삽입에 대해 오류없이 작동합니다. 감사
strlen($query_with_questionmarks) < $max_alloweed_packet
?
쿼리는 max_allowed_packet
일반적으로 제한됩니다 .
를 참조 http://forums.mysql.com/read.php?20,161869 , 그것은 당신의 MySQL의 구성과 관련이 : max_allowed_packet
, bulk_insert_buffer_size
, key_buffer_size
.
max_allowed_packet 제한에 도달하고
오류 : 1390 준비된 문에 자리 표시자가 너무 많습니다.
하나의 SQL에 65535 개의 자리 표시자를 넣을 수 있으므로 한 행에 두 개의 열이있는 경우 하나의 SQL에 32767 개의 행을 삽입 할 수 있습니다.
MySQL에서 50,000 개 이상의 레코드를 가져 오면 일반 오류가 발생합니다. 1390 Prepared 문에 자리 표시자가 너무 많습니다.
하나의 INSERT 문으로 무한한 수의 행을 삽입 할 수 있습니다. 예를 들어 INSERT 쿼리를 실행할 때마다 루프가 천 번 실행되는 저장 프로 시저를 실행할 수 있습니다.
또는 INSERT는 자체적으로 INSERT를 수행하는 트리거를 트립 할 수 있습니다. 다른 트리거를 작동시킵니다. 등등.
아니요, 값 집합의 수에 의존하지 않습니다. 또한 바이트 수에도 의존하지 않습니다.
괄호의 중첩 깊이에는 제한이 있고 전체 문의 길이에는 제한이 있습니다. 이 두 가지 모두 역설적이게도 thedailywtf.com에서 참조됩니다. 그러나 위에서 언급 한 두 가지 방법 모두 이러한 한계를 극복합니다.