2012-04-10 32 views
7

Tôi đang cố chèn bản ghi 15530 vào một bảng nào đó bằng cách sử dụng vỏ SQLite3 nhưng tôi nhận được lỗi đó, tôi đã tìm kiếm giải pháp SQLITE_MAX_COMPOUND_SELECT mặc định là 500 là lý do, nhưng tôi không biết cách thay đổi nó bằng Shell.Vấn đề SQLite khi chèn số lượng lớn các bản ghi

"Lỗi: quá nhiều điều khoản trong hợp chất SELECT"

http://desmond.imageshack.us/Himg861/scaled.php?server=861&filename=sqlite.jpg&res=landing

INSERT INTO table_name (my_id, my_name) VALUES 
(1, 'Aaliyah'), 
(2, 'Alvar Aalto'), 
(3, 'Willie Aames'), 
... 
(15530, 'name'); 
+1

Cài đặt SQLITE_MAX_COMPOUND_SELECT không phải là vấn đề của bạn. * Bạn cần giảm số lượng các thuật ngữ trong câu lệnh SELECT. * Hiển thị cho chúng tôi mã bạn đang sử dụng. –

+1

@RobertHarvey, tốt, đó là giải pháp. Nhưng giới hạn mã hóa/kích thước mảng cứng, trong khi ngăn cản một nhà phát triển trở nên điên rồ hoặc thậm chí là có hiệu suất cao hơn các lựa chọn thay thế, là một điều đáng tiếc ở bên phải của riêng họ. Nó không giống như sqlite có tương đương với 'xargs' để tự động chia nhỏ chèn số lượng lớn thành các câu lệnh lớn nhất có thể (hoặc kích cỡ thông dụng nhất)… (hoặc không?) – binki

Trả lời

4

INSERT INTO không hoạt động theo cách đó.

Hãy thử điều này:

BEGIN TRANSACTION 
INSERT INTO author (author_id, author_name) VALUES (1, 'Aaliyah') 
INSERT INTO author (author_id, author_name) VALUES (2, 'Alvar Aalto') 
INSERT INTO author (author_id, author_name) VALUES (3, 'Willie Aames') 
... 
END TRANSACTION 

http://www.sqlite.org/lang_insert.html

+0

Cảm ơn, Điều đó thực sự khiến tôi suy nghĩ khác và viết lại truy vấn để phù hợp với điều này – enGMzizo

+7

Um yeah, nó * không * hoạt động theo cách đó, kể từ phiên bản 3.7.11. Không còn cần thiết phải sử dụng cách chèn hàng cũ này vào mỗi lần chèn riêng trong giao dịch. Vì vậy, tại sao cách thức mới yêu cầu chúng tôi đang làm một hợp chất lựa chọn, khi đó không còn đúng (truy vấn có "chọn" hư không trong nó!)? – Michael

14

Bội giá trị INSERT INTO cú pháp là introduced in SQLite 3.7.11, vì vậy cú pháp ban đầu là tốt trên các phiên bản gần đây của SQLite. Trên các phiên bản cũ hơn, bạn có thể sử dụng alternative syntax.

Tuy nhiên, giới hạn SQLITE_MAX_COMPOUND_SELECTcannot be raised at runtime, vì vậy, bạn cần phải chia các đoạn chèn của mình thành các lô 500 hàng. Điều này sẽ hiệu quả hơn chèn một hàng cho mỗi truy vấn. Ví dụ.

BEGIN; 
INSERT INTO table_name (id, name) VALUES (1, 'foo'), ..., (500, 'bar'); 
INSERT INTO table_name (id, name) VALUES (501, 'baz'), ..., (1000, 'zzz'); 
... 
COMMIT; 
+4

Tại sao SQLite xử lý nhiều lần chèn như là một lựa chọn khi cú pháp không đồng ý với điều đó? Điều này không có ý nghĩa gì, đặc biệt là trong tài liệu nêu rõ: 'Chúng tôi nghĩ đây là một sự phân bổ hào phóng vì trong thực tế chúng tôi hầu như không bao giờ thấy số lượng từ trong một hợp chất được chọn vượt quá một chữ số. hàng triệu hàng tôi muốn chèn vào một câu lệnh duy nhất! – Michael

+1

@Michael, nếu bạn đang sử dụng sqlite3, bạn nên mong đợi loại điều này bởi vì đó là điểm của sqlite3: là nhẹ ngay cả khi điều đó có nghĩa là loại trừ một số tiện ích được tìm thấy trong DB nặng. Điều đó làm cho kích thước mảng cứng được kích hoạt trên người dùng có thể chấp nhận được trong một thư viện như vậy, và ngay cả trên cơ sở dữ liệu hạng nặng, bạn vẫn có thể muốn chia 'INSERT' với phần' VALUES' lớn thành nhiều 'INSERT'. – binki

Các vấn đề liên quan