SQL 오류 코드는 먼저 제품별 표시 방식과 코드 앞부분의 분류를 확인하고, 그다음 메시지가 가리키는 위치를 확인하는 순서로 읽으면 원인을 빠르게 좁힐 수 있습니다. MySQL은 숫자 오류 번호와 괄호 안 다섯 자리 코드를, PostgreSQL은 다섯 자리 SQLSTATE를, Oracle은 ORA- 뒤 숫자를 사용하므로 확인할 공식 문서도 제품에 맞게 골라야 합니다.
- MySQL은 ERROR 1064 (42000)처럼 숫자 오류 번호와 다섯 자리 코드를 함께 보여 주고, PostgreSQL은 42P01 같은 다섯 자리 SQLSTATE를 보여 줍니다.
- SQLSTATE 앞 두 글자는 오류 분류를 뜻하므로 08은 연결, 23은 제약 조건, 42는 문법과 권한, 40은 동시 작업 충돌로 나누어 볼 수 있습니다.
- 같은 코드라도 원인이 여러 가지이므로 메시지가 지적한 위치, 현재 스키마나 데이터베이스, 값의 중복 여부를 순서대로 확인하는 편이 좋습니다.
- 오류를 고치면서 UPDATE나 DELETE를 실행할 때는 같은 조건으로 SELECT를 먼저 돌려 바뀔 행을 확인하고, 백업이나 트랜잭션으로 되돌릴 준비를 해 두어야 합니다.
- 제품과 버전에 따라 코드와 문구가 달라질 수 있으므로 작업 중인 버전의 공식 오류 문서를 기준으로 판단하는 것이 안전합니다.
SQL 오류 코드, 무엇부터 보면 될까요
SQL 오류 코드는 데이터베이스가 “여기서 멈췄습니다”라고 알려 주는 표식입니다. 코드만 외워도 문제가 바로 풀리지는 않지만, 어떤 종류의 문제인지 알려 주기 때문에 확인 순서를 정할 수 있습니다. 그래서 첫 단계는 코드를 외우는 일이 아니라 코드의 종류를 구분하는 일입니다.
제품마다 코드 생김새가 다릅니다. MySQL은 숫자 오류 번호와 괄호 안 다섯 자리 코드를 함께 보여 주고, PostgreSQL은 다섯 자리 SQLSTATE를 보여 줍니다. Oracle은 ORA- 뒤에 숫자를 붙여 안내합니다. 이 차이를 알고 있으면 오류 문장을 처음 봤을 때 확인할 공식 문서를 바로 고를 수 있습니다.

제품별 표시 예시와 확인할 문서
| 제품 | 표시 예시 | 확인할 공식 문서 |
|---|---|---|
| MySQL 8.x | ERROR 1064 (42000) | MySQL Server Error Reference |
| PostgreSQL | ERROR: 42P01: relation “orders” does not exist | PostgreSQL Error Codes 부록 |
| Oracle | ORA-00942: table or view does not exist | Oracle Database Error Messages |
표의 문장은 이해를 돕기 위한 예시이며, 실제 문구는 서버 버전과 언어 설정에 따라 조금씩 달라질 수 있습니다. 숫자와 코드가 함께 나온다면 둘 다 기록해 두세요.
코드 앞부분만 봐도 원인 범위가 좁아집니다
SQLSTATE는 앞 두 글자로 큰 분류를, 뒤 세 글자로 세부 사유를 나타냅니다. 이 규칙을 알면 처음 보는 코드라도 연결 문제인지, 값 문제인지, 문법 문제인지 빠르게 나눌 수 있습니다.
- 08로 시작하면 연결 문제입니다. 08006은 연결이 끊긴 상태, 08001은 서버에 연결하지 못한 상태를 뜻합니다.
- 23으로 시작하면 값과 제약 조건 문제입니다. 23505는 고유값이 겹칠 때, 23503은 참조하는 부모 값이 없을 때 납니다.
- 42로 시작하면 문법과 권한 문제입니다. 42601은 문법 오류, 42P01은 없는 테이블을 가리킬 때 납니다.
- 40으로 시작하면 동시 작업 충돌입니다. 40001은 다시 시도해야 하는 직렬화 실패, 40P01은 교착 상태를 뜻합니다.
MySQL도 괄호 안에 같은 방식의 다섯 자리 코드를 함께 보여 줍니다. 예를 들어 1064 뒤의 42000은 문법 오류 계열을 뜻합니다. 숫자만 보지 말고 괄호 안 코드를 함께 보는 편이 좋습니다.
대표 오류 문장과 첫 확인 순서
같은 코드라도 원인은 여러 가지입니다. 아래 항목은 오류를 만났을 때 가장 먼저 확인할 내용입니다.
- ERROR 1064(MySQL 문법): 메시지의 near 뒤에 나오는 부분을 봅니다. 오타, 빠진 쉼표, 이름으로 쓴 예약어, 서버 버전에 없는 문법인지 확인합니다.
- 23505 또는 1062(고유값 중복): 넣으려는 값이 이미 있는지 SELECT로 먼저 확인하고, 중복을 허용해야 하는 업무인지도 함께 판단합니다.
- 23503 또는 1452(외래 키): 자식 행이 참조하는 부모 값이 실제로 있는지 확인합니다.
- 42P01 또는 1146(없는 테이블): 이름 철자, 현재 스키마, 접속한 데이터베이스를 확인합니다.
- 08006 또는 2003(연결 실패): 서버 주소, 포트, 방화벽, 계정 권한을 순서대로 확인합니다.
짧은 예제로 확인 지점 찾기
다음은 PostgreSQL을 기준으로 한 예시입니다. 존재하지 않는 테이블을 조회하면 이런 코드가 나옵니다.
SELECT * FROM orders;
-- ERROR: 42P01: relation "orders" does not exist
42P01은 조회 대상이 없다는 뜻이므로 표 이름 철자와 현재 스키마를 확인합니다. 아래처럼 지금 어디에 접속해 있는지 먼저 확인하면 시행착오를 줄일 수 있습니다.
- PostgreSQL에서는 SELECT current_schema(); 로 현재 스키마를 확인합니다.
- MySQL에서는 SELECT DATABASE(); 로 접속한 데이터베이스를 확인합니다.
- Oracle에서는 SELECT USER FROM dual; 로 접속 계정을 확인합니다.
확인 결과가 예상과 다르면 표 이름을 고치기 전에 접속 정보부터 바로잡는 편이 안전합니다.
고치기 전에 되돌릴 준비부터 하기
오류를 고치다 보면 데이터를 바꾸는 명령을 실행할 때가 있습니다. UPDATE나 DELETE는 실행 전에 같은 WHERE 조건으로 SELECT를 돌려 바뀔 행을 눈으로 확인하고, 되돌릴 준비를 함께 해 두세요.
- 백업: MySQL은 mysqldump, PostgreSQL은 pg_dump, Oracle은 Data Pump 같은 도구를 사용합니다.
- 되돌리기: 트랜잭션을 열고 실행한 뒤 결과가 맞을 때만 COMMIT하고, 다르면 ROLLBACK합니다.
- 기록: 오류 코드, 실행한 SQL, 그때의 시각을 함께 남겨 두면 같은 문제가 다시 생겼을 때 빠르게 비교할 수 있습니다.
오류 코드를 읽을 때 지킬 기준
오류 코드는 출발점입니다. 코드로 분류를 정하고, 메시지로 위치를 확인하고, 공식 문서로 뜻을 확인하는 순서를 지키면 대부분의 오류를 스스로 좁힐 수 있습니다.
제품과 버전이 다르면 같은 증상도 다른 코드로 나올 수 있습니다. 작업 중인 제품과 버전을 적어 두고 그 버전의 공식 오류 문서를 기준으로 판단하시길 권합니다.
출처
- MySQL Server Error Reference Oracle (MySQL Documentation) · 2026-10-02
- PostgreSQL Error Codes (Appendix A) PostgreSQL Global Development Group · 2026-10-02