본문 바로가기
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는 새 행을 테이블에 넣어. INSERT INTO users VALUES (...)처럼 열 목록을 생략하면 스키마의 물리 순서에 기대게 되니, 어떤 값이 어디로 가는지 열 이름을 적는 편이 안전해. 여러 행도 한 문장으로 넣을 수 있어.

제약은 넣는 순간 검사돼

NOT NULL, CHECK, UNIQUE, 외래 키를 어긴 값은 저장되지 않아. 실패를 앱에서 미리 흉내 내기보다 데이터베이스 오류를 분명히 처리해. 충돌이 예상되면 ON CONFLICTDO UPDATE를 써서 원자적으로 대응하고, 새 값을 가리킬 때는 EXCLUDED.column을 이용해. 실제 column 이름은 의도를 드러내야 해. 한 번에 5행을 넣어 보며 제약이 전체 문장에 어떻게 적용되는지 확인해.

Code

한 행, 여러 행, 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로 갱신하거나 삽입하기·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

문장 하나로 행 5개를 추가하는 INSERT를 작성해. 같은 INSERT에 ON CONFLICT DO NOTHING을 붙여 다시 실행하고, 두 번 실행해도 중복이나 오류가 생기지 않는지 확인해.

Progress

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

댓글 0

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

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