C.W.K.
Stream
Lesson 04 of 16 · published

INSERT: 행 추가

~10 min · queries, write

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

폼 작성

INSERT 가 행 추가. PostgreSQL 이 행 들어오기 전에 모든 값을 스키마 (타입, 제약, FK) 대조 검증 — 잘못된 insert 는 입구에서 거절, 나중에 데이터 조용히 손상 안 함.

항상 컬럼 나열

INSERT INTO users VALUES (...) 컬럼 이름 없으면 테이블 정의 컬럼 순서 의존. 내일 컬럼 추가하면 그런 INSERT 다 깨짐. 항상 INSERT 할 컬럼 나열; 미래의 자기가 감사함.

다중 행 INSERT 와 UPSERT

한 INSERT 에 여러 행이 루프의 INSERT 여러 개보다 극적으로 빠름 — 라운드트립 적음, 행당 오버헤드 적음. ON CONFLICT 가 '이 행 INSERT, unique key 충돌하면 update' 를 atomic 하게.

Code

Single, multi-row, SELECT 에서·sql
-- Single row (항상 컬럼 나열)
INSERT INTO users (name, email, role)
VALUES ('Alice Johnson', 'alice@example.com', 'admin');

-- Multi-row (한 statement, 여러 행)
INSERT INTO users (name, email, role) VALUES
    ('Bob',   'bob@example.com',   'user'),
    ('Carol', 'carol@example.com', 'user'),
    ('Dave',  'dave@example.com',  'moderator');

-- INSERT ... SELECT (다른 테이블에서 복사)
INSERT INTO orders_archive (id, customer_id, total, placed_at)
SELECT id, customer_id, total, placed_at
FROM   orders
WHERE  placed_at < CURRENT_DATE - INTERVAL '1 year';
ON CONFLICT 로 upsert·sql
-- INSERT; email 충돌 시 name + role update.
INSERT INTO users (email, name, role)
VALUES ('alice@example.com', 'Alice J.', 'admin')
ON CONFLICT (email) DO UPDATE
SET name = EXCLUDED.name,
    role = EXCLUDED.role;

-- INSERT; 충돌 시 아무것도 안 함 (중복 조용히 스킵).
INSERT INTO tags (name) VALUES ('postgres'), ('sql'), ('postgres')
ON CONFLICT (name) DO NOTHING;

External links

Exercise

한 statement 에 5 행 추가하는 INSERT. 같은 INSERT 를 ON CONFLICT DO NOTHING 으로 다시 + 두 번 돌려도 중복/에러 안 나는지 확인.

Progress

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

댓글 0

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

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