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 선언 순서. 깨지기 쉬움.
  • Named columnsINSERT INTO t(a, b) VALUES (...). 항상 이거 써. Schema 변경에 견뎌.
  • Multi-rowINSERT INTO t(a) VALUES (1), (2), (3). 한 transaction, N 개 single-row insert 보다 훨씬 빠름.
  • INSERT ... SELECTINSERT INTO t(a) SELECT x FROM other. 다른 테이블에서 bulk copy.
  • RETURNING (3.35+) — INSERT ... RETURNING id. Round-trip 추가 없이 생성된 값 받기.
  • UPSERT (나중에) — INSERT ... ON CONFLICT(...) DO UPDATE.
Tip: Python 루프로 수천 row insert 하면 루프 전체를 한 transaction 으로 감싸 (conn.execute('BEGIN') ... conn.commit()) 거나 executemany 써. 기본 'statement 당 transaction' 이 사람들이 SQLite 느리다고 오해하는 #1 이유야.

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 3 가지 시간 측정: (1) 루프 안에 INSERT, autocommit, (2) 루프 안 INSERT, single transaction, (3) executemany + single transaction. time.perf_counter 로 측정 후 차이 보고. 첫 번째가 왜 그렇게 느린지 한 단락으로 설명.

Progress

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

댓글 0

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

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