본문 바로가기
C.W.K.
Stream
Lesson 06 of 10 · published

INSERT — 모든 모양

~12 min · schema, insert, dml

Level 0Scout
0 XP0/80 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

가장 흔한 write

INSERT는 단순해 보이지만 알아둘 모양이 몇 가지 있어.

  • PositionalINSERT INTO t VALUES (...). 컬럼 순서가 CREATE TABLE에 적힌 순서를 그대로 따라가. 잘 깨져.
  • 컬럼 이름 명시INSERT INTO t(a, b) VALUES (...). 항상 이걸 써. schema가 바뀌어도 버텨.
  • Multi-rowINSERT INTO t(a) VALUES (1), (2), (3). transaction 하나로 끝나서, single-row insert를 N번 하는 것보다 훨씬 빨라.
  • INSERT ... SELECTINSERT INTO t(a) SELECT x FROM other. 다른 테이블에서 통째로 옮겨올 때.
  • RETURNING — 3.35부터 돼. INSERT ... RETURNING id로 왕복 한 번 더 하지 않고 방금 생긴 값을 바로 받아.
  • UPSERTINSERT ... ON CONFLICT(...) DO UPDATE. 뒤에서 제대로 다뤄.
Tip: Python 루프로 수천 row를 넣을 거면 루프 전체를 transaction 하나로 감싸거나(conn.execute('BEGIN')conn.commit()) executemany를 써. 'statement마다 transaction 하나'라는 기본값이 사람들이 SQLite를 느리다고 오해하는 첫 번째 이유야.

Code

INSERT 5 가지 모양·sql
-- Positional (피하기)
INSERT INTO users VALUES (1, 'a@x.com', 'alice', NULL, 'member', datetime('now'));

-- Named columns (선호)
INSERT INTO users(email, username) VALUES ('a@x.com', 'alice');

-- Multi-row
INSERT INTO users(email, username) VALUES
  ('a@x.com', 'alice'),
  ('b@x.com', 'bob'),
  ('c@x.com', 'carol');

-- INSERT ... SELECT
INSERT INTO users_archive(email, username)
SELECT email, username FROM users WHERE archived = 1;

-- RETURNING (3.35+)
INSERT INTO users(email, username) VALUES ('d@x.com', 'dave')
RETURNING id, created_at;
Python — executemany로 빠른 bulk insert·python
import sqlite3

rows = [(f'user{i}@x.com', f'user{i}') for i in range(10000)]

conn = sqlite3.connect('demo.db')
with conn:                              # transaction context
    conn.executemany(
        'INSERT INTO users(email, username) VALUES (?, ?)',
        rows,
    )
# 10k row 한 transaction — 보통 <100 ms

External links

Exercise

Python에서 작은 테이블에 10,000 row를 넣는 데 걸리는 시간을 세 가지로 재봐. 루프 안에서 INSERT를 autocommit으로 돌릴 때, 루프 전체를 transaction 하나로 감쌀 때, 그리고 executemany를 transaction 하나로 감쌀 때. time.perf_counter로 재고 차이를 적어. 첫 번째가 왜 그렇게 느린지 한 단락으로 설명해봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.