복붙노트

[SQL] 그것은 SQLite는 데이터베이스에 한 번에 여러 행을 삽입 할 수 있습니까?

SQL

그것은 SQLite는 데이터베이스에 한 번에 여러 행을 삽입 할 수 있습니까?

MySQL의에서이 같은 여러 행을 삽입 할 수 있습니다 :

INSERT INTO 'tablename' ('column1', 'column2') VALUES
    ('data1', 'data2'),
    ('data1', 'data2'),
    ('data1', 'data2'),
    ('data1', 'data2');

나는 이런 식으로 뭔가를 할 때 그러나, 나는 오류를 얻고있다. 그것은 SQLite는 데이터베이스에 한 번에 여러 행을 삽입 할 수 있습니까? 그렇게 할 수있는 구문은 무엇입니까?

해결법

  1. ==============================

    1.BrianCampbell 여기에서 지적 하듯이, 3.7.11을 SQLite에 이상 이제 원래의 게시물의 간단한 구문을 지원합니다. 레거시 데이터베이스에서 최대의 호환성을하려는 경우, 표시되는 방식은 여전히 ​​적절하다.

    BrianCampbell 여기에서 지적 하듯이, 3.7.11을 SQLite에 이상 이제 원래의 게시물의 간단한 구문을 지원합니다. 레거시 데이터베이스에서 최대의 호환성을하려는 경우, 표시되는 방식은 여전히 ​​적절하다.

    내가 권한을 가지고 있다면, 나는 앤디의 대답을 범프 것입니다 : 당신은 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'
    

    나는 원래 효율적으로 루비에서 레일에 대규모 데이터 세트를로드하는 데이 기술을 사용했다. 제이미 쿡 지적 그러나,이 더 빨리 단일 트랜잭션 내의 개별 INSERT들 포장되어 분명하지 않다 :

    BEGIN TRANSACTION;
    INSERT INTO 'tablename' table VALUES ('data1', 'data2');
    INSERT INTO 'tablename' table VALUES ('data3', 'data4');
    ...
    COMMIT;
    

    효율이 목표 인 경우, 먼저이를 시도해야합니다.

    여러 사람이 주석으로는 UNION ALL (위 그림 참조) 사용하는 경우, 모든 행은이 경우에, 당신은 데이터 2, 데이터 1의 네 개의 행을 얻을 것, 삽입됩니다. 당신이 ALL을 생략 할 경우, 중복 행은 제거 될 것이다 (그리고 작업이 아마 조금 느려집니다). 더 밀접하게 원래의 게시물의 의미를 일치하기 때문에 우리는 UNION ALL을 사용하고 있습니다.

    P.S : 제발 한 앤디의 답변이 아니라 내! 그는 첫번째 솔루션을 발표했다.

  2. ==============================

    2.네, 그것은하지만 보통의 쉼표로 구분 된 삽입 값이 가능합니다.

    네, 그것은하지만 보통의 쉼표로 구분 된 삽입 값이 가능합니다.

    이 시도...

    insert into myTable (col1,col2) 
         select aValue as col1,anotherValue as col2 
         union select moreValue,evenMoreValue 
         union...
    

    예, 값 세트에서 문장의 생성을 자동화하는 작은 추악한하지만 쉽게 충분하다. 또한, 당신은 단지 첫 번째 선택에서 열 이름을 선언 할 필요가 나타납니다.

  3. ==============================

    3.예, SQLite는 3.7.11 현재 동 SQLite는 지원됩니다. SQLite는 문서에서 :

    예, SQLite는 3.7.11 현재 동 SQLite는 지원됩니다. SQLite는 문서에서 :

    (이 대답은 원래 작성되었을 때,이 지원되지 않습니다)

    SQLite는 이전 버전과의 호환성을 위해, 당신은하지만 3.7.11 이후 여기에 설명 된 간단한 구문을 선호한다를 들어, 앤디가 제시 한 트릭을 사용하고 UNION을 사용하여 fearless_fool 수 있습니다.

  4. ==============================

    4.나는 빨리 각각의 삽입을 실행하는 것보다 훨씬이었다 삽입 일련의 명령문에서 하나의 500 요소 다중 행 삽입을 생성하는 일부 루비 코드를 썼다. 그럼 난 단순히 단일 트랜잭션으로 여러 삽입을 포장 시도하고 내가 상당히 적은 코드로 속도까지 같은 종류를 얻을 수 있다는 것을 발견했다.

    나는 빨리 각각의 삽입을 실행하는 것보다 훨씬이었다 삽입 일련의 명령문에서 하나의 500 요소 다중 행 삽입을 생성하는 일부 루비 코드를 썼다. 그럼 난 단순히 단일 트랜잭션으로 여러 삽입을 포장 시도하고 내가 상당히 적은 코드로 속도까지 같은 종류를 얻을 수 있다는 것을 발견했다.

    BEGIN TRANSACTION;
    INSERT INTO table VALUES (1,1,1,1);
    INSERT INTO table VALUES (2,2,2,2);
    ...
    COMMIT;
    
  5. ==============================

    5.이 지원되지 않는이 페이지에 따르면 :

    이 지원되지 않는이 페이지에 따르면 :

      INSERT INTO table (col1, col2) VALUES 
          ('row1col1', 'row1col2'), ('row2col1', 'row2col2'), ...
    

    버전 3.7.11 현재 SQLite는 지원 다중 행 삽입을한다. 리처드는 Hipp 코멘트 :

  6. ==============================

    6.버전 2012-03-20 (3.7.11), SQLite는 지원 다음 INSERT 구문에서 시작

    버전 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

    PS : 브라이언 캠벨의 응답 / 대답하십시오 1. 광산하지! 그는 첫번째 솔루션을 발표했다.

  7. ==============================

    7.다른 포스터 말했듯이, SQLite는이 구문을 지원하지 않습니다. 나는 복합 삽입은 SQL 표준의 일부 있다면 모르겠지만, 내 경험에 그들은 많은 제품에서 구현되지 것입니다.

    다른 포스터 말했듯이, SQLite는이 구문을 지원하지 않습니다. 나는 복합 삽입은 SQL 표준의 일부 있다면 모르겠지만, 내 경험에 그들은 많은 제품에서 구현되지 것입니다.

    여담으로, 당신은 당신이 명시 적 트랜잭션에서 여러 INSERT를 포장하는 경우 SQLite는에 삽입 성능이 상당히 개선되는 것을 알고 있어야합니다.

  8. ==============================

    8.예, SQL은이 작업을 수행하지만, 다른 문법을 할 수 있습니다. SQLite는 문서는 방법으로, 아주 좋은 것입니다. 또한 여러 행을 삽입 할 수있는 유일한 방법은 데이터의 소스를 삽입하는 등의 선택 문을 사용 있음을 알려드립니다.

    예, SQL은이 작업을 수행하지만, 다른 문법을 할 수 있습니다. SQLite는 문서는 방법으로, 아주 좋은 것입니다. 또한 여러 행을 삽입 할 수있는 유일한 방법은 데이터의 소스를 삽입하는 등의 선택 문을 사용 있음을 알려드립니다.

  9. ==============================

    9.sqlite3를은 SELECT를 통해 제외하고는 SQL에서 직접 할 수 없어, 그리고 SELECT는 표현의 "행"을 반환 할 수 있지만, 나는 그것이 가짜 열을 반환 할 수있는 방법을 알고.

    sqlite3를은 SELECT를 통해 제외하고는 SQL에서 직접 할 수 없어, 그리고 SELECT는 표현의 "행"을 반환 할 수 있지만, 나는 그것이 가짜 열을 반환 할 수있는 방법을 알고.

    그러나, CLI는 그것을 할 수 있습니다 :

    .import FILE TABLE     Import data from FILE into TABLE
    .separator STRING      Change separator used by output mode and .import
    
    $ sqlite3 /tmp/test.db
    SQLite version 3.5.9
    Enter ".help" for instructions
    sqlite> create table abc (a);
    sqlite> .import /dev/tty abc
    1
    2
    3
    99
    ^D
    sqlite> select * from abc;
    1
    2
    3
    99
    sqlite> 
    

    당신은 INSERT 주위에 루프를 넣어 할 경우, 오히려 CLI의 .import 명령을 사용하는 것보다, 다음 INSERT 속도에 대한 SQLite는 질문에 조언을 따라야합니다 :

  10. ==============================

    10.알렉스 올바른지 다음 "선택 ... 노조"문이 일부 사용자에게 매우 중요하다 순서를 잃게됩니다. 특정 순서로 삽입 할 경우에도, SQLite는 변경 일이 너무 삽입 순서가 중요한 경우 트랜잭션을 사용하는 것을 선호합니다.

    알렉스 올바른지 다음 "선택 ... 노조"문이 일부 사용자에게 매우 중요하다 순서를 잃게됩니다. 특정 순서로 삽입 할 경우에도, SQLite는 변경 일이 너무 삽입 순서가 중요한 경우 트랜잭션을 사용하는 것을 선호합니다.

    create table t_example (qid int not null, primary key (qid));
    begin transaction;
    insert into "t_example" (qid) values (8);
    insert into "t_example" (qid) values (4);
    insert into "t_example" (qid) values (9);
    end transaction;    
    
    select rowid,* from t_example;
    1|8
    2|4
    3|9
    
  11. ==============================

    11.fearless_fool는 이전 버전에 대한 좋은 해답을 가지고있다. 난 그냥 당신이 당신이 모든 열이 나열해야 할 필요가 있음을 추가하고 싶었다. 당신이 3 열이있는 경우 그래서, 당신은 3 열을 반드시 선택 행위를 확인해야합니다.

    fearless_fool는 이전 버전에 대한 좋은 해답을 가지고있다. 난 그냥 당신이 당신이 모든 열이 나열해야 할 필요가 있음을 추가하고 싶었다. 당신이 3 열이있는 경우 그래서, 당신은 3 열을 반드시 선택 행위를 확인해야합니다.

    예 : 나는 3 열을 가지고 있지만 난 단지 데이터의 2 열 가치를 삽입 할. 이 표준 정수 ID이기 때문에 나는 첫 번째 열에 대한 상관 없어 가정합니다. 나는 다음을 수행 할 수 ...

    INSERT INTO 'tablename'
          SELECT NULL AS 'column1', 'data1' AS 'column2', 'data2' AS 'column3'
    UNION SELECT NULL, 'data3', 'data4'
    UNION SELECT NULL, 'data5', 'data6'
    UNION SELECT NULL, 'data7', 'data8'
    

    주 : 순서를 잃게됩니다 "선택 ... 노조"문을 기억하십시오. (AG1에서)

  12. ==============================

    12.

    INSERT INTO TABLE_NAME 
                (DATA1, 
                 DATA2) 
    VALUES      (VAL1, 
                 VAL2), 
                (VAL1, 
                 VAL2), 
                (VAL1, 
                 VAL2), 
                (VAL1, 
                 VAL2), 
                (VAL1, 
                 VAL2), 
                (VAL1, 
                 VAL2), 
                (VAL1, 
                 VAL2), 
                (VAL1, 
                 VAL2); 
    
  13. ==============================

    13.당신은하지만 난 당신이 무엇을 그리워 생각하지 않습니다 수 없습니다.

    당신은하지만 난 당신이 무엇을 그리워 생각하지 않습니다 수 없습니다.

    이 과정에서 SQLite는 항상 호출하기 때문에, 그것은 거의 당신이 1 삽입 문 또는 100 삽입 문을 실행할지 여부 성능에 문제가되지 않습니다. 그러나 많은 시간이 그래서 트랜잭션 내에서 그 100 삽입물을 넣어 소요 커밋합니다.

    SQLite는 훨씬 빠르게 당신이 매개 변수화 된 쿼리를 사용하는 경우이다 (훨씬 덜 필요한 구문 분석)이 같은하지 CONCATENATE 큰 문 것이라고 나는 그렇게 :

    insert into mytable (col1, col2)
    select 'a','b'
    union 
    select 'c','d'
    union ...
    

    그들은 모든 연결된 문이 다르기 때문에 또 다시 구문 분석 할 필요가있다.

  14. ==============================

    14.MySQL의에서 당신은 여러 값을 삽입 할 수 없습니다 라이트 하지만 당신은 연결을 한 번만 열고 모든 삽입을 수행 한 후 연결을 종료하여 시간을 절약 할 수 있습니다. 그것은 많은 시간을 절약

    MySQL의에서 당신은 여러 값을 삽입 할 수 없습니다 라이트 하지만 당신은 연결을 한 번만 열고 모든 삽입을 수행 한 후 연결을 종료하여 시간을 절약 할 수 있습니다. 그것은 많은 시간을 절약

  15. ==============================

    15.트랜잭션을 사용에 대한 문제는 당신이 읽기 또한 테이블을 잠글 것입니다. 삽입하기 위해 정말 많은 데이터를 가지고 당신이 exemple를 들어, 데이터에 대한 액세스를 미리 정도 필요가있는 경우에는이 방법이 잘 작동하지 않습니다.

    트랜잭션을 사용에 대한 문제는 당신이 읽기 또한 테이블을 잠글 것입니다. 삽입하기 위해 정말 많은 데이터를 가지고 당신이 exemple를 들어, 데이터에 대한 액세스를 미리 정도 필요가있는 경우에는이 방법이 잘 작동하지 않습니다.

    다른 솔루션과 문제는 당신이 삽입의 순서를 잃을 것입니다

    insert into mytable (col)
    select 'c'
    union 
    select 'd'
    union 
    select 'a'
    union 
    select 'b';
    

    SQLite는 상기 데이터 스토어에서의 A, B, C, D ... 것

  16. ==============================

    16.나는 3.6.13를 사용하고 있습니다

    나는 3.6.13를 사용하고 있습니다

    나는이 같은 명령 :

    insert into xtable(f1,f2,f3) select v1 as f1, v2 as f2, v3 as f3 
    union select nextV1+, nextV2+, nextV3+
    

    (50 개) 기록을 동시에 삽입하여, 단지 제 이하인 걸린다.

    그것은 시간이 매우 가능하다 여러 행을 삽입 SQLite는 사용 사실입니다. 으로 @Andy 밝혔다.

    덕분에 앤디 +1

  17. ==============================

    17.

    INSERT INTO tabela(coluna1,coluna2) 
    SELECT 'texto','outro'
    UNION ALL 
    SELECT 'mais texto','novo texto';
    
  18. ==============================

    18.당신이 SQLite는 관리자 파이어 폭스 플러그인을 사용하면, INSERT SQL 문에서 대량 삽입을 지원합니다.

    당신이 SQLite는 관리자 파이어 폭스 플러그인을 사용하면, INSERT SQL 문에서 대량 삽입을 지원합니다.

    (윈도우, OS X, 리눅스에서 작동)가이 기능을 지원하지 않습니다 가리키고 있지만, SQLite는 브라우저 않습니다

  19. ==============================

    19.나는 다음과 같은 쿼리를 가지고 있지만, ODBC 드라이버 SQLite는가에 오류가 있습니다 ","그것은 말했다. 나는 HTA (HTML 응용 프로그램)에서 VBScript를 실행합니다.

    나는 다음과 같은 쿼리를 가지고 있지만, ODBC 드라이버 SQLite는가에 오류가 있습니다 ","그것은 말했다. 나는 HTA (HTML 응용 프로그램)에서 VBScript를 실행합니다.

    INSERT INTO evrak_ilac_iliskileri (evrak_id, ilac_id, baglayan_kullanici_id, tarih) VALUES (4150,762,1,datetime()),(4150,9770,1,datetime()),(4150,6609,1,datetime()),(4150,3628,1,datetime()),(4150,9422,1,datetime())
    
  20. ==============================

    20.SQLite는 3.7.2에서 :

    SQLite는 3.7.2에서 :

    INSERT INTO table_name (column1, column2) 
                    SELECT 'value1', 'value1' 
              UNION SELECT 'value2', 'value2' 
              UNION SELECT 'value3', 'value3' 
    

    등등

  21. ==============================

    21.나는 동적 쿼리를 만들 수 있어요. 이것은 내 테이블 :

    나는 동적 쿼리를 만들 수 있어요. 이것은 내 테이블 :

    TABLE "tblPlanner을"CREATE ( "probid"텍스트는 "사용자 ID"TEXT는 "selectedtime"DATETIME은 "plannerid"TEXT는 "isLocal"BOOL은, TEXT, "코멘트"TEXT "제목이"TEXT "애플리케이션 ID")

    나는 그래서 NSArray를 내가이 다음에 내부의 모든 것을 가져 오신 후에하는 JSON을 통해 모든 데이터를 받고 있어요 :

        NSMutableString *query = [[NSMutableString alloc]init];
        for (int i = 0; i < arr.count; i++)
        {
            NSString *sqlQuery = nil;
            sqlQuery = [NSString stringWithFormat:@" ('%@', '%@', '%@', '%@', '%@', '%@', '%@', '%@'),",
                        [[arr objectAtIndex:i] objectForKey:@"plannerid"],
                        [[arr objectAtIndex:i] objectForKey:@"probid"],
                        [[arr objectAtIndex:i] objectForKey:@"userid"],
                        [[arr objectAtIndex:i] objectForKey:@"selectedtime"],
                        [[arr objectAtIndex:i] objectForKey:@"isLocal"],
                        [[arr objectAtIndex:i] objectForKey:@"subject"],
                        [[arr objectAtIndex:i] objectForKey:@"comment"],
                        [[NSUserDefaults standardUserDefaults] objectForKey:@"applicationid"]
                        ];
            [query appendString:sqlQuery];
        }
        // REMOVING LAST COMMA NOW
        [query deleteCharactersInRange:NSMakeRange([query length]-1, 1)];
    
        query = [NSString stringWithFormat:@"insert into tblPlanner (plannerid, probid, userid, selectedtime, isLocal, applicationid, subject, comment) values%@",query];
    

    그리고 마지막으로 출력 쿼리는 이것이다 :

    insert into tblPlanner (plannerid, probid, userid, selectedtime, isLocal, applicationid, subject, comment) values 
    <append 1>
    ('pl1176428260', '', 'US32552', '2013-06-08 12:00:44 +0000', '0', 'subj', 'Hiss', 'ap19788'),
    <append 2>
    ('pl2050411638', '', 'US32552', '2013-05-20 10:45:55 +0000', '0', 'TERI', 'Yahoooooooooo', 'ap19788'), 
    <append 3>
    ('pl1828600651', '', 'US32552', '2013-05-21 11:33:33 +0000', '0', 'test', 'Yest', 'ap19788'),
    <append 4>
    ('pl549085534', '', 'US32552', '2013-05-19 11:45:04 +0000', '0', 'subj', 'Comment', 'ap19788'), 
    <append 5>
    ('pl665538927', '', 'US32552', '2013-05-29 11:45:41 +0000', '0', 'subj', '1234567890', 'ap19788'), 
    <append 6>
    ('pl1969438050', '', 'US32552', '2013-06-01 12:00:18 +0000', '0', 'subj', 'Cmt', 'ap19788'),
    <append 7>
    ('pl672204050', '', 'US55240280', '2013-05-23 12:15:58 +0000', '0', 'aassdd', 'Cmt', 'ap19788'), 
    <append 8>
    ('pl1019026150', '', 'US32552', '2013-06-08 12:15:54 +0000', '0', 'exists', 'Cmt', 'ap19788'), 
    <append 9>
    ('pl790670523', '', 'US55240280', '2013-05-26 12:30:21 +0000', '0', 'qwerty', 'Cmt', 'ap19788')
    

    이는 또한 코드를 잘 실행하고 나는 성공적 SQLite는 모든 것을 저장할 수 있어요.

    이 전에 내가 UNION 쿼리 물건 동적 만든하지만 일부 구문 오류를주는 시작했다. 어쨌든,이 나를 위해 잘 실행되고 있습니다.

  22. ==============================

    22.나는 아무도 준비된 문을 언급되지 것을 놀라게하고있다. 당신은 그 자체가 아닌 다른 언어에서 SQL을 사용하지 않는 경우, 그때 트랜잭션에 싸여 그 준비된 명령문이 여러 행을 삽입하는 가장 효율적인 방법이 될 것이라고 생각합니다.

    나는 아무도 준비된 문을 언급되지 것을 놀라게하고있다. 당신은 그 자체가 아닌 다른 언어에서 SQL을 사용하지 않는 경우, 그때 트랜잭션에 싸여 그 준비된 명령문이 여러 행을 삽입하는 가장 효율적인 방법이 될 것이라고 생각합니다.

  23. ==============================

    23.당신이 InsertHelper을 사용할 수 있습니다, 그것은 쉽고 빠르게

    당신이 InsertHelper을 사용할 수 있습니다, 그것은 쉽고 빠르게

    선적 서류 비치: http://developer.android.com/reference/android/database/DatabaseUtils.InsertHelper.html

    지도 시간: http://www.outofwhatbox.com/blog/2010/12/android-using-databaseutils-inserthelper-for-faster-insertions-into-sqlite-database/

    편집하다: InsertHelper은 레벨 17 API의로 사용되지 않습니다

  24. ==============================

    24.당신이 bash 쉘을 사용하는 경우, 당신은이를 사용할 수 있습니다 :

    당신이 bash 쉘을 사용하는 경우, 당신은이를 사용할 수 있습니다 :

    time bash -c $'
    FILE=/dev/shm/test.db
    sqlite3 $FILE "create table if not exists tab(id int);"
    sqlite3 $FILE "insert into tab values (1),(2)"
    for i in 1 2 3 4; do sqlite3 $FILE "INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5"; done; 
    sqlite3 $FILE "select count(*) from tab;"'
    

    당신이 sqlite가 CLI에있는 경우 또는, 당신은이 작업을 수행 할 필요가 :

    create table if not exists tab(id int);"
    insert into tab values (1),(2);
    INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
    INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
    INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
    INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
    select count(*) from tab;
    

    그것은 어떻게 작동합니까? 그것은 그 경우 테이블 탭을 사용합니다 :

    id int
    ------
    1
    2
    

    다음 선택 a.id, 탭 A로부터 b.id, 탭 B를 반환

    a.id int | b.id int
    ------------------
        1    | 1
        2    | 1
        1    | 2
        2    | 2
    

    등등. 먼저 실행 한 후 2 행, 2 ^ 3 = 8을 삽입한다. (세 우리가 탭 a를 가지고 있기 때문에, 탭 (B), 탭 C)

    두 번째 실행 한 결과, 추가 (2 + 8) = 1000 ^ 3 행을 삽입

    최대 (1000 ^ 3, 5e5)에 대한 제 우리에 넣은 후에 행 500000 등을 = ...

    이것은 나를 위해 SQLite는 데이터베이스를 채우는 방법 가장 빠른 알려져있다.

  25. from https://stackoverflow.com/questions/1609637/is-it-possible-to-insert-multiple-rows-at-a-time-in-an-sqlite-database by cc-by-sa and MIT license