본문 바로가기

Programming/DB/SQL

sql 컬럼명 변경(rename column name)

 


테이블명은 다음의 질의로 변경할 수 있다.

rename old_table to new_table;

컬럼명은 직접적으로 변경할 수 없다.
즉, 컬럼명 변경은 오라클에서 지원하지 않는다.
여러가지 편법중 많이 쓰이는 2가지 방법이 있다.

1.
변경할 원본테이블을 복사후 원본테이블 DROP
복사된 테이블을 RENAME TABLE을 이용하여 원본테이블명으로 변경
단점: 제약조건, 트리거등등이 같이 제거되므로 제약조건 재생성필요

2.
원본테이블에 변경하고자 하는 컬럼명 ADD
원하는 컬럼명을 기존 컬럼에서 값을 복사
기존 컬럼제거

2번째 방법이 제약조건등의 영향이 적으므로 나는 이 방법을 사용했다.

test 테이블 변경. nm을 name컬럼명으로 변경

ALTER TABLE test
ADD NAME VARCHAR2(14)

UPDATE test SET NAME=NM;

ALTER TABLE test
DROP COLUMN NM;



test 테이블 변경. nm, cd을 name, code컬럼명으로 변경
ALTER TABLE test
        ADD name        VARCHAR2(50)
        ADD code        VARCHAR2(14)

UPDATE test SET NAME = NM, code=cd

ALTER TABLE test
         DROP (NM, cd)



컬럼명 변경 II

이미 전에 글이 있으나, 오라클에서 컬럼에 대한 drop, rename에 대해 질문이 자주 올라와서 시간을 내어 다시 실습위주로 정리해 봤습니다. 아무쪼록 많은 도움이 되시길..

예제로 사용할 테이블은 다음과 같고, kang이라는 사용자가 소유한 테이블입니다.

create table test
(
id varchar(10),
pass varchar(10)
);

변경할 컬럼은 pass로, 이를 passwd라는 컬럼명으로 변경하겠습니다.


방법 1
SQL질의를 사용하는 아래의 예는 오라클 9iR2이상에서만 가능합니다.
즉, 오라클 9i부터 컬럼명 변경을 위한 SQL문법이 제공됩니다.

SQL> alter table test
  2  rename column pass to passwd;

테이블이 변경되었습니다.

SQL> desc test
이름                                      널?      유형
----------------------------------------- -------- ------------
ID                                                 VARCHAR2(10)
PASS                                               VARCHAR2(10)




8i이하에서 변경하려면 다음과 같이 할 수 있습니다.
아래의 방법을 사용할때는 무결성제약조건을 고려하여 신중하게 작업하시길 바랍니다.

방법 2
system or sys로 로그인해야 하므로 일반사용자는 변경할 수 없습니다.
단점: 가장 큰 문제는 과정이 쬐금 복잡하므로 외우기도 힘들죠.
장점: 아무 큰 테이블에 적용할때 유용할 것 같네요. 실제적인 데이터 이동작업이 필요없으므로..

SQL> conn system/manager
연결되었습니다.
SQL> UPDATE SYS.COL$ C
  2  SET C.NAME = 'PASSWD' --new column name
  3  WHERE
  4  C.NAME = 'PASS' --old column name
  5  AND
  6  C.OBJ# IN
  7  (
  8   SELECT O.OBJ# FROM SYS.OBJ$ O, SYS.USER$ U
  9   WHERE
10   O.OWNER# = U.USER#
11   AND
12   U.NAME = 'KANG' --owner name
13   AND
14   O.NAME = 'TEST' --table name
15  );

1 행이 갱신되었습니다.

SQL> desc kang.test
이름                                      널?      유형
----------------------------------------- -------- ------------
ID                                                 VARCHAR2(10)
PASS                                               VARCHAR2(10)



방법 3
변경할 컬럼명을 가진 view로 대체한다.
이건 정확히 테이블에 있는 컬럼명변경이 아니므로 조금 논외가 아닐까 싶기도 하지만..

SQL> rename test to test_orig;

테이블명이 바뀌었습니다.

SQL> create view test(id, passwd) as select * from test_orig;

뷰가 생성되었습니다.

SQL> desc test
이름                                      널?      유형
----------------------------------------- -------- -------------
ID                                                 VARCHAR2(10)
PASSWD                                             VARCHAR2(10)



방법 4
변경할 컬럼명으로 테이블을 재생하여 기존테이블로부터 테이터를 가져옵니다.
큰 테이블에 대해 이같이 한다면 부하가 클테니 알아서 하시길..

SQL> create table test_tmp(id, passwd) as select * from test;

테이블이 생성되었습니다.

SQL> drop table test;

테이블이 삭제되었습니다.

SQL> rename test_tmp to test;

테이블명이 바뀌었습니다.

SQL> desc test
이름                                      널?      유형
----------------------------------------- -------- -------------
ID                                                 VARCHAR2(10)
PASSWD                                             VARCHAR2(10)


방법 5
새로운 컬럼명으로 컬럼을 add하고, 기존의 컬럼은 제거한다.
컬럼의 제거는 8i이상에서 가능하므로(SQL문법을 제공한다는 의미입니다.) 이 방법은 8i이상일때 가능하겠습니다.

SQL> alter table test
  2  add (passwd varchar(10));

테이블이 변경되었습니다.

SQL> update test set passwd=pass;

0 행이 갱신되었습니다.        (데이터가 없어서 0입니다. 실제의 경우 테이블 row수만큼 표시되겠죠?)

SQL> alter table test drop column pass;

테이블이 변경되었습니다.

SQL> desc test;
이름                                      널?      유형
----------------------------------------- -------- -------------
ID                                                 VARCHAR2(10)
PASSWD                                             VARCHAR2(10)

This article comes from dbakorea.pe.kr (Leave this line as is)