2026년 06월 22일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-00957 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-00957 duplicate column name 는?
ORA-00957 에러는 CREATE TABLE 또는 ALTER TABLE 구문 실행 시, 동일한 테이블 내에서 컬럼명이 중복으로 정의되었을 때 발생하는 Oracle 데이터베이스 에러입니다. Oracle은 하나의 테이블 또는 뷰 내에서 각 컬럼이 고유한 이름을 가져야 한다는 규칙을 엄격히 적용하며, 이를 위반할 경우 즉시 이 에러를 반환합니다. 또한 SELECT 문에서 서브쿼리를 인라인 뷰로 사용하거나, CREATE VIEW 구문 작성 시에도 동일한 컬럼명이 결과셋에 포함될 때 동일한 에러가 발생할 수 있어 개발자와 DBA 모두 주의가 필요합니다.
주요 발생 원인
1. CREATE TABLE 또는 ALTER TABLE 시 동일한 컬럼명 중복 정의
가장 빈번하게 발생하는 원인으로, DDL 작성 시 실수로 동일한 컬럼명을 두 번 이상 입력하는 경우입니다. 특히 컬럼 수가 많은 대형 테이블을 설계하거나, 기존 DDL 스크립트를 복사·붙여넣기하여 수정할 때 이 실수가 자주 발생합니다. 컬럼명은 Oracle 내부적으로 대소문자를 구분하지 않고 비교하므로, COLUMN_NAME과 column_name도 동일한 이름으로 처리됩니다.
2. JOIN 쿼리나 서브쿼리에서 동일한 컬럼명을 별칭 없이 SELECT 할 때
두 개 이상의 테이블을 JOIN하거나 UNION 연산을 수행할 때, 여러 테이블에 동일한 이름의 컬럼이 존재하는 경우 별칭(Alias)을 지정하지 않고 SELECT *를 사용하거나 명시적으로 동일한 컬럼명을 두 번 선택하면 에러가 발생합니다. 이 상황은 특히 CREATE TABLE AS SELECT(CTAS) 구문이나 CREATE VIEW 구문에서 자주 나타나며, 인라인 뷰로 감쌀 때에도 동일하게 적용됩니다.
3. ALTER TABLE ADD COLUMN 시 이미 존재하는 컬럼명과 충돌
운영 중인 테이블에 새로운 컬럼을 추가할 때, 이미 동일한 이름의 컬럼이 존재하는지 사전 확인 없이 ADD COLUMN을 실행하면 발생합니다. 시스템이 오랜 기간 운영되면서 여러 개발자가 스키마를 변경한 경우, 현재 테이블 구조를 정확히 파악하지 못한 상태에서 이 에러를 만나는 경우가 실무에서 매우 흔합니다.
해결 방법
원인 1 해결: CREATE TABLE 중복 컬럼 수정
에러 발생 예시:
-- ORA-00957 발생 예시
CREATE TABLE employees (
emp_id NUMBER(10),
emp_name VARCHAR2(100),
department VARCHAR2(50),
emp_name VARCHAR2(100) -- 중복 컬럼명!
);
수정된 올바른 구문:
-- 올바른 CREATE TABLE 구문
CREATE TABLE employees (
emp_id NUMBER(10) PRIMARY KEY,
emp_name VARCHAR2(100) NOT NULL,
department VARCHAR2(50),
hire_date DATE,
salary NUMBER(12, 2)
);
원인 2 해결: JOIN 또는 CTAS에서 컬럼 별칭 사용
에러 발생 예시 (CREATE TABLE AS SELECT):
-- ORA-00957 발생 예시: 두 테이블 모두 DEPT_ID 컬럼 보유
CREATE TABLE emp_dept_info AS
SELECT e.emp_id,
e.dept_id, -- employees 테이블의 dept_id
d.dept_id, -- departments 테이블의 dept_id (중복!)
d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id;
수정된 올바른 구문:
-- 별칭(Alias)을 사용하여 중복 컬럼명 해결
CREATE TABLE emp_dept_info AS
SELECT e.emp_id,
e.dept_id AS emp_dept_id,
d.dept_id AS dept_master_id,
d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id;
CREATE VIEW에서의 해결 예시:
-- ORA-00957 발생 뷰 생성 예시
CREATE OR REPLACE VIEW v_emp_dept AS
SELECT e.emp_id,
e.name,
d.name -- employees, departments 모두 name 컬럼 보유 시 중복
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id;
-- 수정: 명확한 별칭 지정
CREATE OR REPLACE VIEW v_emp_dept AS
SELECT e.emp_id,
e.name AS emp_name,
d.name AS dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id;
원인 3 해결: ALTER TABLE 전 컬럼 존재 여부 확인
컬럼 추가 전 반드시 아래 쿼리로 기존 컬럼 존재 여부를 확인하세요:
-- 특정 테이블의 컬럼 목록 조회
SELECT column_name,
data_type,
data_length,
nullable
FROM user_tab_columns
WHERE table_name = 'EMPLOYEES' -- 테이블명은 대문자로 입력
ORDER BY column_id;
컬럼이 존재하지 않는 것을 확인한 후 ADD:
-- 안전한 컬럼 추가
ALTER TABLE employees
ADD (mobile_phone VARCHAR2(20));
만약 스크립트를 자동화하거나, 컬럼이 없을 때만 추가하고 싶다면 PL/SQL을 활용하세요:
-- 컬럼 존재 여부 확인 후 조건부 추가 (PL/SQL)
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_count
FROM user_tab_columns
WHERE table_name = 'EMPLOYEES'
AND column_name = 'MOBILE_PHONE';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'ALTER TABLE employees ADD (mobile_phone VARCHAR2(20))';
DBMS_OUTPUT.PUT_LINE('컬럼이 성공적으로 추가되었습니다.');
ELSE
DBMS_OUTPUT.PUT_LINE('이미 존재하는 컬럼입니다. 추가를 건너뜁니다.');
END IF;
END;
/
예방 방법
1. DDL 작성 시 표준 네이밍 컨벤션과 코드 리뷰 프로세스 도입
테이블 설계 단계부터 컬럼 명명 규칙(Naming Convention)을 팀 전체가 공유하고 준수해야 합니다. 예를 들어, 외래키 컬럼은 반드시 참조테이블명_ID 형식을 사용하도록 규정하면, JOIN 시 컬럼명 충돌 가능성을 크게 줄일 수 있습니다. 또한 모든 DDL 변경 스크립트는 반드시 동료 DBA 또는 선임 개발자의 코드 리뷰를 거친 후 운영 환경에 반영하는 프로세스를 의무화하면 실수를 사전에 방지할 수 있습니다.
2. 운영 DB 변경 전 항상 USER_TAB_COLUMNS 또는 ALL_TAB_COLUMNS를 활용한 사전 검증 수행
운영 테이블에 DDL을 적용하기 전, USER_TAB_COLUMNS, ALL_TAB_COLUMNS, DBA_TAB_COLUMNS 등의 데이터 딕셔너리 뷰를 활용하여 현재 테이블 구조를 먼저 확인하는 습관을 반드시 들여야 합니다. 특히 마이그레이션, 배포 자동화 스크립트 작성 시에는 앞서 소개한 PL/SQL 조건부 처리 패턴을 표준으로 채택하여, 중복 컬럼 추가 시도 자체를 원천 차단하는 방어적 코딩 방식을 적용하는 것을 강력히 권장합니다.
관련 에러
- ORA-00904:
invalid identifier— 존재하지 않는 컬럼명을 참조할 때 발생하며, 컬럼명 오타 수정 후 동일한 이름으로 재생성 시 ORA-00957과 함께 나타나는 경우가 있습니다. - ORA-01430:
column being added already exists in table— ALTER TABLE ADD 구문에서 이미 존재하는 컬럼을 추가하려 할 때 발생하는 에러로, ORA-00957과 발생 맥락이 매우 유사합니다. - ORA-00955:
name is already used by an existing object— 테이블, 뷰, 시퀀스 등 객체 이름 중복 시 발생하며, 스키마 설계 오류라는 점에서 ORA-00957과 같은 범주의 에러입니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.