2013-06-05 3 views
2

한 테이블에 행을 삽입하고 해당 행에서 생성 된 ID를 다른 행에 사용하여 전체 트랜잭션을 처리 할 수 ​​있습니까? 내가 가지고있는 문제는 100k 레코드가 있기 때문에 대규모 db 대기 시간이 있지만 한 번에 1 ~ 100 개만 처리 할 수 ​​있다는 것입니다.여러 테이블에 삽입 SQLite

INSERT INTO foo; 
INSERT into bar(foo_id) VALUES (last_foo_id) 
INSERT into bar(foo_id) VALUES (last_foo_id) 
INSERT into bar(foo_id) VALUES (last_foo_id) 
INSERT into bar(foo_id) VALUES (last_foo_id) 
INSERT into bar(foo_id) VALUES (last_foo_id) 
INSERT INTO foo; 
INSERT into bar(foo_id) VALUES (last_foo_id) 
INSERT into bar(foo_id) VALUES (last_foo_id) 
INSERT into bar(foo_id) VALUES (last_foo_id) 
INSERT into bar(foo_id) VALUES (last_foo_id) 
INSERT into bar(foo_id) VALUES (last_foo_id) 
+0

얼마나 많은'bar' 레코드를 삽입하고 있습니까? 트랜잭션을 시작하고, foo에 삽입하고, 여러 개의 바 삽입을 수행 한 다음 커밋합니다. 새로운 트랜잭션을 시작하고 다른'foo'를 실행 한 다음'bar's, commit 등을 수행하십시오. –

+0

예. 이미 그렇게하고있어. 여전히 병목 현상이 발생했습니다. 저는 술집에 99 % 인서트를하고 있습니다. – Bluebaron

+0

클라이언트 SQLite 라이브러리 및/또는 언어는 무엇입니까? 그것은 Perl, Python, SQLite C/API 또는 다른 것입니까? – mvp

답변

0

last_insert_rowid() 기능을 사용하십시오.

+0

술집에 두 번째 삽입하여 나는 술집에서 테이블 바에서 ID를 얻을거야. – Bluebaron

1

foo 기록을 삽입 한 후, sqlite3_last_insert_rowid과의 ID를 읽을 (또는 무엇이든 데이터베이스 래퍼가에 사용), 그리고 다음의 모든 bar 삽입 문에서 그 값을 사용

db.execute("BEGIN TRANSACTION") 
db.execute("INSERT INTO foo ...") 
foo_id = db.last_insert_rowid 
db.execute("INSERT INTO bar(foo_id) VALUES (?)", [foo_id]) 
... 
db.execute("COMMIT TRANSACTION") 
+0

트랜잭션에서 어떻게 래핑 할 수 있습니까? 이것이 실제로이 질문의 목적입니다. – Bluebaron

+0

서클에서 실행 중입니다. – Bluebaron

+0

다른 문장을 어떻게 감쌀 것입니다. 이 ID는 거래와 어떤 관련이 있습니까? –

관련 문제