mysql에 여러 행 삽입


349

한 번에 여러 행을 삽입하면 데이터베이스 쿼리가 더 빠릅니까?

처럼

INSERT....

UNION

INSERT....

UNION

(2-3000 행과 같이 삽입해야합니다)


8
UNION은 선택을위한 것입니다.
야곱

1
행은 어떻게됩니까? MySQL Query Browser에서 직접 SQL을 작성하거나 PHP 또는 C # 또는 다른 곳에서 SQL을 사용하고 있습니까? 후자의 경우, 다음 링크를 확인 하십시오. 100k 레코드를 삽입하는 가장 빠른 방법 여러 행이있는 빠른 삽입
RKh

답변:


1176

INSERT구문을 사용하는 문은 VALUES여러 행을 삽입 할 수 있습니다. 이렇게하려면 각각 괄호로 묶고 쉼표로 구분 된 여러 열 값 목록을 포함하십시오.

예:

INSERT INTO tbl_name
    (a,b,c)
VALUES
    (1,2,3),
    (4,5,6),
    (7,8,9);

출처


@RPK. 동의하지만 그녀의 데이터 소스를 모르겠습니다. 이미 쓴 것처럼 파일이 있으면 cularis가 제안한대로로드 데이터 구문을 사용합니다. :)
Nicola Cossu

을 사용하는 것도 가능합니다 INSERT INTO Table SELECT 1, '14/05/2012', 3 UNION SELECT 2, '05/14/2012', 3. 물론 이것은 삽입 된 값이 다른 테이블에서 나오는 것보다 낫습니다.
Zohar Peled

72
때로는 간단한 구문을 잊어 버렸기 때문에 유용한 참조.
Captain Hypertext

a, b 및 c는 행의 내용을 저장하는 임시 변수입니까?
Lealo

3
@Lealo 아니오, 동일한 순서로 값을 삽입 할 테이블 열 이름입니다.
BeetleJuice

60

텍스트 파일에 데이터가있는 경우 LOAD DATA INFILE을 사용할 수 있습니다 .

텍스트 파일에서 테이블을로드 할 때 LOAD DATA INFILE을 사용하십시오. 일반적으로 INSERT 문을 사용하는 것보다 20 배 빠릅니다.

INSERT 문 최적화

위의 링크에서 삽입 문의 속도를 높이는 방법에 대한 추가 정보를 찾을 수 있습니다.


3
중복 된 레코드는 어떻습니까?
Matteo

2
@Matteo Duplicates는 정의한 스키마를 기반으로 데이터베이스에 의해 삽입되거나 거부됩니다.
ankush981

mysql 멀티 쿼리 사용
Francisco Yepes Barrera

1
두 번째 링크 404.
dimir

1
끊어진 링크 "삽입 속도"는 이제 INSERT 문 최적화 에서 다룹니다 .
케네스 M. 콜라 노

27
BEGIN;
INSERT INTO test_b (price_sum)
  SELECT price
  FROM   test_a;
INSERT INTO test_c (price_summ) 
  SELECT price
FROM   test_a;
COMMIT;

3
다른 표에서 검색된 데이터를 대량 삽입 할 수 있습니다.
Novastorm

4
"다른 테이블에서 검색된 데이터를 대량 삽입"해야한다는 점을 감안할 때이 코드에서 무슨 일이 일어나고 있는지에 대한 설명 만 있다면 ...
Aleister Tanek Javas Mraz

0

다음은 : :( 다 대다 관계) 테이블과 함께 사용할 수있는 PHP 솔루션입니다.

// get data
$table_1 = get_table_1_rows();
$table_2_fk_id = 123;

// prepare first part of the query (before values)
$query = "INSERT INTO `table` (
   `table_1_fk_id`,
   `table_2_fk_id`,
   `insert_date`
) VALUES ";

//loop the table 1 to get all foreign keys and put it in array
foreach($table_1 as $row) {
    $query_values[] = "(".$row["table_1_pk_id"].", $table_2_fk_id, NOW())";
}

// Implode the query values array with a coma and execute the query.
$db->query($query . implode(',',$query_values));

implode ()를 사용하면 "마지막 문자"문제를 피할 수 있지만 엄청난 메모리 오버 헤드가 발생합니다. 그녀는 3000 개의 행을 요청했으며 각 행에 1kb의 데이터가 있다고 가정합니다. 이는 이미 3MB의 원시 데이터입니다. 어레이는 $ table_1에서 30MB의 메모리를 이미 사용하므로 스크립트는 60MB를 사용합니다. 그냥 말하면, 그렇지 않으면 좋은 해결책입니다
John

내 상황에 유용합니다.
Bilal Şimşek

-11
// db table name / blog_post / menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO product_cate (site_title, sub_title) 
  VALUES ('$site_title', '$sub_title')";

// db table name / blog_post / menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO menu (menu_title, sub_menu)
  VALUES ('$menu_title', '$sub_menu', )";

// db table name / blog_post /  menu /  site_title
// Insert into Table (column names separated with comma)
$sql = "INSERT INTO blog_post (post_title, post_des, post_img)
  VALUES ('$post_title ', '$post_des', '$post_img')";

이 응답의 혼동 외에도 PHP를 사용한다고 가정하면 SQL 삽입에 취약 할 수 있습니다.
ultrafez 2016 년

2
1. SQL 코드에 버그가 있습니다. 2. 다음 $ sql 값은 이전 $ sql 값을 대체합니다.
Marwan Salim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.