CodeGym /행동 /SQL SELF /데이터 삽입과 업데이트 과정에서의 에러 처리

데이터 삽입과 업데이트 과정에서의 에러 처리

SQL SELF
레벨 22 , 레슨 3
사용 가능

데이터 삽입과 업데이트 과정에서의 에러 처리

테이블에 새로운 데이터를 넣을 때 자주 만나는 에러들을 같이 살펴보자.

에러 1: 필수 필드에 NULL을 넣으려고 할 때

PostgreSQL은 데이터베이스 규칙이 잘 지켜지는지 엄청 신경 써. 에러의 원인이 될 수 있는 제약 조건 예시를 볼게:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL, -- 이름은 NULL이 될 수 없어
    age INT
);

-- 에러: name 필드는 꼭 채워야 해
INSERT INTO students (name, age) VALUES (NULL, 20);

결과: 에러 null value in column "name" of relation "students" violates not-null constraint`.

어떤 데이터를 넣는지 항상 신경 써야 해. 예전엔 이 컬럼이 NULL을 허용했을 수도 있지만, 이제는 필수 필드가 됐을 수도 있거든.

에러 2: 유니크 컬럼에 데이터 중복

CREATE TABLE courses (
    course_id SERIAL PRIMARY KEY,
    course_name TEXT UNIQUE -- 코스 이름은 유니크해야 해
);

-- 첫 번째 삽입은 성공
INSERT INTO courses (course_name) VALUES ('SQL Basics');

-- 두 번째 삽입은 에러 발생
INSERT INTO courses (course_name) VALUES ('SQL Basics');

결과: 에러 duplicate key value violates unique constraint`.

이건 보통 네 잘못이 아니라, 사용자가 실수로 같은 동작을 두 번 한 거야. 이런 상황에서는 딱히 뭘 할 필요 없어.

에러 3: 참조 무결성 위반

CREATE TABLE enrollments (
    enrollment_id SERIAL PRIMARY KEY,
    student_id INT REFERENCES students(id), -- 해당 ID의 학생이 있어야 해
    course_id INT REFERENCES courses(course_id)
);

-- 에러: ID = 99인 학생이 없어
INSERT INTO enrollments (student_id, course_id) VALUES (99, 1);

결과: 에러 insert or update on table "enrollments" violates foreign key constraint`.

이런 에러가 나는 건 오히려 좋은 거야. 데이터베이스 무결성이 깨지는 것보다 훨씬 낫지. 아마 데이터베이스랑 통신하는 코드에 버그가 있거나, 데이터가 오래됐을 수도 있어. 어쨌든, 데이터베이스가 무결성을 지켜줬다면 그건 아주 좋은 거야.

PostgreSQL에서의 에러 처리

맞아, 에러는 생길 수밖에 없어. 근데 중요한 건 에러를 그냥 보는 게 아니라, 잘 다루는 거야.

트랜잭션: 데이터 보호의 무기

데이터 작업할 때는 트랜잭션을 자주 써서 데이터 일관성을 지켜. 에러가 나면 변경사항을 되돌릴 수 있거든.

예시: 두 테이블에 데이터 추가하기.

BEGIN; -- 트랜잭션 시작

-- students 테이블에 데이터 삽입
INSERT INTO students (name, age) VALUES ('Otto Lin', 21);

-- enrollments 테이블에 레코드 삽입
-- 만약 ID=10인 코스가 없으면 여기서 에러 발생
INSERT INTO enrollments (student_id, course_id) VALUES (1, 10);

-- 다 성공하면
COMMIT;
-- 에러가 나면 변경사항 "롤백"
ROLLBACK;

course_id = 10인 코스가 없으면, students 테이블에 넣은 것도 같이 취소돼.

트랜잭션에서의 에러 처리

PostgreSQL에서는 에러를 미리 예측해서 EXCEPTION 블록을 써서 쿼리 안에서 바로 처리할 수 있어.

예시: 학생을 추가하고 코스에 등록시키기. 에러가 나면 에러 내용을 로그에 남겨.

DO $$
BEGIN
    -- 데이터 삽입 시도
    INSERT INTO students (name, age) VALUES ('Anna Song', 22);
    INSERT INTO enrollments (student_id, course_id) VALUES (2, 999); -- 에러

    -- 다 성공하면
    RAISE NOTICE '레코드가 성공적으로 추가됐어!';
EXCEPTION
    WHEN foreign_key_violation THEN
        -- 외래키 위반 처리
        RAISE WARNING '입력한 course_id의 코스가 없어.';
END $$;

ON CONFLICT로 유니크 체크하기

UNIQUE 제약 조건 위반 에러를 미리 막으려면 ON CONFLICT 구문을 쓰면 돼. 충돌이 날 때 어떻게 할지 정할 수 있거든.

예시: 중복된 코스 넣으려고 하면 그냥 넘어가기.

INSERT INTO courses (course_name)
    VALUES ('SQL Basics')
ON CONFLICT (course_name) DO NOTHING; -- 중복 데이터는 무시

아니면 기존 행을 업데이트할 수도 있어:

INSERT INTO courses (course_name)
    VALUES ('SQL Basics')
ON CONFLICT (course_name) DO UPDATE     
    SET course_name = EXCLUDED.course_name || ' (Updated)';

ON CONFLICT 연산자에 대해서는 다음 단계에서, 대량 데이터 업로드 다룰 때 더 자세히 알려줄게 :P

데이터 작업에서 자주 나오는 에러와 예방 방법

이미 봤겠지만, 에러의 주된 원인은 이거야:

  1. 제약 조건 위반 (NOT NULL, UNIQUE, FOREIGN KEY).
  2. 업데이트나 삭제할 때 쿼리에 WHERE 조건이 없는 경우.
  3. 트랜잭션 실행 순서 실수.

이렇게 하면 안전해질 수 있어:

  • 큰 작업에는 트랜잭션과 ROLLBACK을 꼭 써.
  • 삽입 전에 항상 데이터 체크!
  • 에러는 꼭 로그로 남겨서 분석해.
  • 중복 레코드 방지하려면 ON CONFLICT를 활용해.

이제 에러와 싸울 무기가 생겼어! 기억해: 좋은 개발자는 실수 안 하는 사람이 아니라, 실수를 잘 고치는 사람이야.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION