MySQL에서는 다음과 같이 여러 행을 삽입 할 수 있습니다.
INSERT INTO 'tablename' ('column1', 'column2') VALUES
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2');
그러나 이와 같은 작업을 시도하면 오류가 발생합니다. SQLite 데이터베이스에 한 번에 여러 행을 삽입 할 수 있습니까? 그렇게하는 구문은 무엇입니까?
답변
최신 정보
BrianCampbell이 여기서 지적한 대로 , SQLite 3.7.11 이상은 이제 원래 게시물의 더 간단한 구문을 지원합니다 . 그러나 레거시 데이터베이스에서 최대의 호환성을 원하는 경우 표시된 방법이 여전히 적합합니다.
원래 답변
권한이 있다면 리버의 대답 을 범할 것입니다. SQLite에 여러 행을 삽입 할 수 있습니다 . 다른 구문이 필요 합니다 . 완벽하게 명확하게하기 위해 OPs MySQL 예제는 다음과 같습니다.
INSERT INTO 'tablename' ('column1', 'column2') VALUES
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2'),
('data1', 'data2');
다음과 같이 SQLite로 다시 캐스팅 할 수 있습니다.
INSERT INTO 'tablename'
SELECT 'data1' AS 'column1', 'data2' AS 'column2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'
성능에 대한 메모
원래이 기술을 사용하여 Ruby on Rails에서 대용량 데이터 세트를 효율적으로로드했습니다. 그러나 , 제이미 쿡 지적으로 , 그것은 개별 포장이는 빨리 분명하지 않다 INSERTs
단일 트랜잭션 내에서 :
BEGIN TRANSACTION;
INSERT INTO 'tablename' table VALUES ('data1', 'data2');
INSERT INTO 'tablename' table VALUES ('data3', 'data4');
...
COMMIT;
효율성이 목표라면 먼저 시도해야합니다.
UNION과 UNION ALL에 대한 메모
여러 사람들이 언급했듯이 UNION ALL
(위에 표시된 것처럼)을 사용하면 모든 행이 삽입되므로이 경우 4 개의 행이 나타납니다 data1, data2
. 를 생략하면 ALL
중복 행이 제거되고 작업이 약간 느려질 수 있습니다. UNION ALL은 원래 게시물의 의미와 더 가깝기 때문에 UNION ALL을 사용하고 있습니다.
닫는 중
추신 : 솔루션을 먼저 제시 했으므로 river ‘s reply +1하십시오 .
답변
가능하지만 일반적인 쉼표로 구분 된 삽입 값으로는 불가능합니다.
이 시도…
insert into myTable (col1,col2)
select aValue as col1,anotherValue as col2
union select moreValue,evenMoreValue
union...
예, 값 집합에서 명령문 생성을 자동화 할 수있는 약간 추악하지만 쉽지 않습니다. 또한 첫 번째 선택에서만 열 이름을 선언하면됩니다.
답변
예, SQLite 3.7.11부터는 SQLite에서 지원됩니다. 보내는 사람 SQLite는 설명서 :
(이 답변이 처음 작성된 경우 지원되지 않았습니다)
SQLite는 이전 버전과의 호환성을 위해, 당신은 제안 트릭 사용할 수 있습니다 앤디를 하고 fearless_fool 사용 UNION
하지만 3.7.11 이후 여기에 설명 된 간단한 구문을 선호한다 위해.
답변
개별 인서트를 실행하는 것보다 훨씬 빠른 일련의 insert 문에서 단일 500 요소 다중 행 인서트를 생성하는 루비 코드를 작성했습니다. 그런 다음 여러 인서트를 단일 트랜잭션으로 래핑하려고 시도했지만 코드가 적 으면서 동일한 종류의 속도를 얻을 수 있음을 발견했습니다.
BEGIN TRANSACTION;
INSERT INTO table VALUES (1,1,1,1);
INSERT INTO table VALUES (2,2,2,2);
...
COMMIT;
답변
이 페이지 에 따르면 지원되지 않습니다 :
- 2007-12-03 : 다중 행 INSERT 일명 복합 INSERT는 지원되지 않습니다.
INSERT INTO table (col1, col2) VALUES
('row1col1', 'row1col2'), ('row2col1', 'row2col2'), ...
실제로, SQL92 표준에 따르면 VALUES 표현식은 자체적으로 작동 할 수 있어야합니다. 예를 들어, 다음은 3 개의 행이있는 1 열 테이블을 반환해야합니다.
VALUES 'john', 'mary', 'paul';
버전 3.7.11부터 SQLite 는 다중 행 삽입을 지원 합니다. 리차드 히프
“새로운 다중 값 인서트는 컴파운드 인서트에 대한 구문 적 suger (sic) 일뿐입니다. 어떤 방법 으로든 성능상의 이점은 없습니다.”
답변
버전 2012-03-20 (3.7.11)부터 sqlite는 다음 INSERT 구문을 지원합니다.
INSERT INTO 'tablename' ('column1', 'column2') VALUES
('data1', 'data2'),
('data3', 'data4'),
('data5', 'data6'),
('data7', 'data8');
문서 읽기 : http://www.sqlite.org/lang_insert.html
추신 : Brian Campbell의 답변 / 답변에 +1하십시오. 내 것이 아닙니다! 그는 먼저 해결책을 제시했다.
답변
다른 포스터가 말했듯이 SQLite는이 구문을 지원하지 않습니다. 복합 INSERT가 SQL 표준의 일부인지 모르겠지만 내 경험상 많은 제품에서 구현 되지 않았습니다 .
또한 명시적인 트랜잭션으로 여러 INSERT를 래핑하면 SQLite의 INSERT 성능이 크게 향상됩니다.