Skip to main content
Summary

조회와 변경은 마음가짐이 다릅니다

지금까지는 주로 데이터를 읽는 방법을 배웠습니다. SELECT는 장부를 펼쳐 보는 일에 가깝습니다. 잘못 조회해도 원본 데이터가 바뀌지는 않습니다.

이번 장부터는 장부에 직접 글씨를 쓰는 명령을 다룹니다.

  • INSERT: 새 기록을 추가합니다.

  • UPDATE: 기존 기록을 고칩니다.

  • DELETE: 기존 기록을 지웁니다.

이 세 명령은 유용하지만 조심해야 합니다. 고객 전화번호를 잘못 고치거나, 주문 내역을 실수로 지우면 업무에 바로 영향을 줍니다. 그래서 중요한 원칙이 있습니다.

데이터를 바꾸는 명령은 무서워할 필요는 없지만, 되돌릴 수 있는 습관을 먼저 가져야 합니다.

앞으로는 데이터를 바꾸기 전에 다음 순서를 기본으로 생각하세요.

  1. 백업: 중요한 데이터라면 CSV로 내보내거나 백업 테이블을 만듭니다.

  2. 미리보기 SELECT: 같은 조건으로 먼저 조회해서 대상 행을 확인합니다.

  3. 트랜잭션 확인: BEGIN으로 시작하고, 확실하면 COMMIT, 아니면 ROLLBACK합니다.

엑셀로 비유하면, 원본 파일을 복사해 두고, 수정할 행을 필터로 확인한 뒤, 저장할지 말지 결정하는 과정입니다.

데이터를 추가하고 고치는 안전한 방법AI 생성 이미지

INSERT: 새 기록을 한 줄 추가하기

INSERT는 테이블에 새 행을 추가하는 명령입니다. 고객 명단에 새 고객을 한 명 적거나, 상품 목록에 새 상품을 하나 등록하는 일과 같습니다.

기본 모양은 이렇습니다.

INSERT INTO 테이블이름 (컬럼1, 컬럼2, 컬럼3)
VALUES (값1, 값2, 값3);

여기서 중요한 점은 컬럼 이름의 순서와 값의 순서가 맞아야 한다는 것입니다.

고객 한 명 추가하기

하려는 일은 다음과 같습니다.

고객 테이블에 이름이 김하나이고, 전화번호가 010-1111-2222이며, 지역이 서울인 고객을 새로 추가한다.

먼저 같은 전화번호가 이미 있는지 확인합니다. 새로 추가하는 일이라도 중복 등록을 막기 위해 미리보기가 필요합니다.

SELECT customer_id, customer_name, phone, city
FROM customers
WHERE phone = '010-1111-2222';

결과가 없다면 아직 등록되지 않은 고객이라고 볼 수 있습니다. 이제 트랜잭션을 시작하고 추가합니다.

BEGIN;

INSERT INTO customers (customer_name, phone, city, joined_at)
VALUES ('김하나', '010-1111-2222', '서울', CURRENT_DATE)
RETURNING customer_id, customer_name, phone, city, joined_at;

RETURNING은 PostgreSQL에서 자주 쓰는 편리한 기능입니다. 방금 추가된 행을 바로 보여 달라는 뜻입니다.

예상 결과는 다음과 비슷합니다.

customer_idcustomer_namephonecityjoined_at
8김하나010-1111-2222서울2026-06-26

결과 해석은 간단합니다. customers 테이블에 고객 한 명이 새로 들어갔고, PostgreSQL이 customer_id를 8번으로 붙여 주었습니다.

아직 끝이 아닙니다. 정말 원하는 대로 들어갔는지 다시 조회합니다.

SELECT customer_id, customer_name, phone, city, joined_at
FROM customers
WHERE phone = '010-1111-2222';

문제가 없다면 저장합니다.

COMMIT;

만약 이름이나 전화번호를 잘못 입력했다면 저장하지 않고 취소합니다.

ROLLBACK;

COMMIT은 "이대로 확정"이고, ROLLBACK은 "방금 한 작업 취소"입니다.

상품 하나 추가하기

하려는 일은 다음과 같습니다.

상품 테이블에 무선 마우스를 새 상품으로 등록한다. 가격은 25000원, 재고는 30개이다.

먼저 같은 상품명이 있는지 확인합니다.

SELECT product_id, product_name, price, stock_quantity
FROM products
WHERE product_name = '무선 마우스';

없다면 추가합니다.

BEGIN;

INSERT INTO products (product_name, price, stock_quantity)
VALUES ('무선 마우스', 25000, 30)
RETURNING product_id, product_name, price, stock_quantity;

결과에 새 상품이 보이면 확인 후 확정합니다.

COMMIT;

실무에서는 상품명만으로 중복을 완벽히 판단하기 어려울 수 있습니다. 같은 이름의 상품이라도 색상, 옵션, 공급사가 다를 수 있기 때문입니다. 그래서 실제 업무에서는 상품 코드 같은 고유한 기준을 함께 두는 것이 좋습니다.

주문 한 건 추가하기

주문은 고객과 상품보다 조금 더 조심해야 합니다. 주문은 보통 고객, 결제, 배송, 재고와 연결되기 때문입니다. 여기서는 단순한 예로 주문 기본 정보만 추가해 보겠습니다.

하려는 일은 다음과 같습니다.

8번 고객이 오늘 25000원짜리 주문을 했고, 주문 상태는 주문접수로 기록한다.

먼저 고객이 실제로 있는지 확인합니다.

SELECT customer_id, customer_name, phone
FROM customers
WHERE customer_id = 8;

고객이 확인되면 주문을 추가합니다.

BEGIN;

INSERT INTO orders (customer_id, order_date, status, total_amount)
VALUES (8, CURRENT_DATE, '주문접수', 25000)
RETURNING order_id, customer_id, order_date, status, total_amount;

결과 해석은 이렇습니다. orders 테이블에 주문 한 건이 새로 생겼고, 그 주문은 customer_id 8번 고객과 연결되어 있습니다.

확인 후 저장합니다.

COMMIT;

UPDATE: 기존 기록 고치기

UPDATE는 이미 있는 행의 값을 바꾸는 명령입니다. 고객 전화번호 수정, 상품 가격 변경, 주문 상태 변경에 사용합니다.

기본 모양은 이렇습니다.

UPDATE 테이블이름
SET 바꿀컬럼 = 새값
WHERE 조건;

여기서 가장 중요한 부분은 WHERE입니다.

WHERE가 없으면 테이블의 모든 행이 바뀔 수 있습니다. 고객 한 명의 지역을 바꾸려다가 모든 고객의 지역을 서울로 바꾸는 일이 생길 수 있습니다.

따라서 UPDATE 전에는 반드시 같은 WHERE 조건으로 SELECT를 먼저 실행합니다.

고객 전화번호 수정하기

하려는 일은 다음과 같습니다.

고객 번호가 8번인 김하나 고객의 전화번호를 010-3333-4444로 수정한다.

먼저 수정 대상이 맞는지 조회합니다.

SELECT customer_id, customer_name, phone
FROM customers
WHERE customer_id = 8;

결과가 다음과 같다고 해 봅시다.

customer_idcustomer_namephone
8김하나010-1111-2222

이제 이 한 명만 바꾸면 됩니다.

BEGIN;

UPDATE customers
SET phone = '010-3333-4444'
WHERE customer_id = 8
RETURNING customer_id, customer_name, phone;

결과가 한 행만 나오면 정상입니다.

customer_idcustomer_namephone
8김하나010-3333-4444

다시 확인합니다.

SELECT customer_id, customer_name, phone
FROM customers
WHERE customer_id = 8;

문제가 없으면 확정합니다.

COMMIT;

만약 결과가 여러 행이거나, 원하지 않는 고객이 포함되었다면 바로 취소합니다.

ROLLBACK;

주문 상태 바꾸기

하려는 일은 다음과 같습니다.

주문 번호가 15번인 주문의 상태를 배송중으로 바꾼다.

먼저 현재 상태를 확인합니다.

SELECT order_id, customer_id, order_date, status
FROM orders
WHERE order_id = 15;

확인 후 수정합니다.

BEGIN;

UPDATE orders
SET status = '배송중'
WHERE order_id = 15
RETURNING order_id, status;

결과 해석은 이렇습니다. 주문 번호 15번의 상태만 배송중으로 바뀌었습니다. 원하는 결과라면 저장합니다.

COMMIT;

UPDATE를 사용할 때는 "몇 행이 바뀌었는가"를 꼭 보세요. 한 명만 바꿔야 하는데 20행이 바뀌었다면 조건이 너무 넓은 것입니다.

DELETE: 기록을 실제로 지우기

DELETE는 행을 삭제하는 명령입니다. 엑셀에서 한 줄을 선택하고 삭제하는 것과 비슷하지만, 데이터베이스에서는 더 신중해야 합니다.

특히 주문 내역, 결제 내역, 고객 상담 기록은 나중에 증빙이나 분석에 필요할 수 있습니다. 그래서 실무에서는 완전히 지우기보다 status를 취소, 사용안함, 삭제요청처럼 바꾸는 방식을 쓰기도 합니다.

그래도 정말 삭제해야 할 때가 있습니다. 이때는 반드시 순서를 지킵니다.

  1. 삭제 대상 백업

  2. 삭제 대상 미리보기 SELECT

  3. BEGIN

  4. DELETE

  5. 결과 확인

  6. COMMIT 또는 ROLLBACK

삭제 전 백업하기

하려는 일은 다음과 같습니다.

고객 번호 8번을 삭제하기 전에 해당 고객 정보를 백업 테이블에 복사해 둔다.

먼저 삭제할 고객을 확인합니다.

SELECT *
FROM customers
WHERE customer_id = 8;

중요한 데이터라면 pgAdmin이나 DBeaver에서 조회 결과를 CSV로 내보낼 수 있습니다. 화면에서 결과표를 우클릭하거나 Export 기능을 사용하면 됩니다.

SQL로 간단한 백업 테이블을 만들 수도 있습니다.

CREATE TABLE customers_delete_backup_20260626 AS
SELECT *
FROM customers
WHERE customer_id = 8;

이 명령은 customers 테이블 전체를 백업하는 것이 아니라, customer_id = 8 조건에 맞는 행만 새 백업 테이블에 복사합니다.

백업이 되었는지 확인합니다.

SELECT *
FROM customers_delete_backup_20260626;

고객 한 명 삭제하기

하려는 일은 다음과 같습니다.

백업을 마친 뒤 고객 번호 8번을 삭제한다.

다시 한 번 삭제 대상을 미리 봅니다.

SELECT customer_id, customer_name, phone
FROM customers
WHERE customer_id = 8;

대상이 맞다면 삭제합니다.

BEGIN;

DELETE FROM customers
WHERE customer_id = 8
RETURNING customer_id, customer_name, phone;

결과에 삭제된 고객 한 명이 표시됩니다. 이 결과는 "이 행이 삭제 대상이었다"는 확인표입니다.

삭제 후 정말 없어졌는지 확인합니다.

SELECT customer_id, customer_name, phone
FROM customers
WHERE customer_id = 8;

결과가 없다면 삭제된 것입니다.

확실하면 저장합니다.

COMMIT;

조금이라도 이상하면 취소합니다.

ROLLBACK;

만약 삭제 중 오류가 난다면, 그 고객과 연결된 주문이 있기 때문일 수 있습니다. 이는 데이터베이스가 "주문이 남아 있는데 고객만 지우면 장부가 맞지 않는다"고 막아 주는 상황입니다. 이런 보호 장치를 외래키라고 부릅니다. 자세한 연결 관계는 이후 조인과 테이블 설계 장에서 다시 다룹니다.

트랜잭션: 결제 전 장바구니 확인하기

트랜잭션은 여러 작업을 하나의 묶음으로 다루는 방법입니다.

온라인 쇼핑몰 장바구니를 떠올려 보세요.

  • 장바구니에 상품을 담습니다.

  • 수량을 바꿉니다.

  • 쿠폰을 적용합니다.

  • 마지막 결제 버튼을 누릅니다.

결제 버튼을 누르기 전까지는 아직 확정이 아닙니다. 마음이 바뀌면 장바구니를 비울 수 있습니다.

SQL에서도 비슷합니다.

BEGIN;

이제부터 하는 변경 작업을 하나의 장바구니에 담겠다는 뜻입니다.

COMMIT;

장바구니 내용을 최종 결제하듯, 변경 내용을 확정합니다.

ROLLBACK;

결제하지 않고 장바구니를 비우듯, BEGIN 이후의 변경을 취소합니다.

pgAdmin이나 DBeaver 같은 도구에서는 자동 커밋 설정이 켜져 있을 수 있습니다. 자동 커밋은 SQL을 실행할 때마다 바로 저장하는 방식입니다. 초보자는 중요한 수정 작업을 할 때 자동 커밋 여부를 확인하고, 가능하면 BEGIN, COMMIT, ROLLBACK을 직접 쓰며 연습하는 것이 좋습니다.

안전한 변경 작업 체크리스트

데이터를 바꾸기 전에는 아래 질문을 스스로 확인하세요.

  • 지금 접속한 데이터베이스가 맞는가?

  • 수정할 테이블이 맞는가?

  • WHERE 조건이 너무 넓지 않은가?

  • 같은 조건으로 SELECT를 먼저 실행했는가?

  • 중요한 데이터라면 CSV나 백업 테이블을 만들었는가?

  • BEGIN으로 시작했는가?

  • 결과 행 수가 예상과 같은가?

  • 확실하면 COMMIT, 이상하면 ROLLBACK할 준비가 되었는가?

이번 장에서 배운 내용은 어렵다기보다 조심스러운 내용입니다. INSERT, UPDATE, DELETE 자체는 짧은 명령입니다. 하지만 실무에서 중요한 것은 명령을 외우는 것보다 실수해도 멈출 수 있는 절차를 갖는 일입니다.

앞으로 데이터를 바꿀 때는 이 순서를 기억하세요.

백업 → 미리보기 SELECT → BEGIN → 변경 SQL → 확인 SELECT → COMMIT 또는 ROLLBACK

이 습관만 있어도 대부분의 초보자 실수를 크게 줄일 수 있습니다.

책 목록

비개발자를 위한 PostgreSQL 입문: 업무 데이터를 안전하게 다루는 가장 쉬운 방법

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기