본문 바로가기
Oracle

테이블 컬럼 순서 변경방법(Oracle,Tibero,Mysql,MSSQL)

by 취미툰 2021. 3. 24.
반응형

테이블 컬럼의 순서를 변경하는 방법에 대해서 각 DB에 따라 방법을 정리해보았습니다.

 

Oracle

oracle의 경우 12c를 기준으로 나뉩니다. 12c의 신기술을 사용해서 기존 버전보다 편하게 컬럼의 순서를 변경할 수 있게 되었기 때문입니다.

 

~ 11g R2 까지

기존 테이블을 Drop&Create하는 방법으로 컬럼순서를 변경할 수 있습니다.

기존 테이블을 Drop하기 때문에 관련 코멘트나 권한등이 없어집니다.(기존 테이블이 아닌 새로운 테이블이기 때문입니다). 번거로운 방법이지만 이 방법밖에 없다고 보면 될것 같습니다.

 

테스트

EMP의 DEPTNO와 COMM 컬럼의 순서를 변경

 

0.버전확인
TEST@XE> select instance_name,version from v$Instance;

INSTANCE_NAME    VERSION
---------------- -----------------
XE               11.2.0.2.0

1.변경전 확인
TEST@XE> select * from emp;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 19-NOV-20        800 (null)             20
      7499 ALLEN      SALESMAN        7698 19-NOV-20       1600        300         30
      7521 WARD       SALESMAN        7698 19-NOV-20       1250        500         30
      7566 JONES      MANAGER         7839 19-NOV-20       2975 (null)             20
      7654 MARTIN     SALESMAN        7698 19-NOV-20       1250       1400         30
      7698 BLAKE      MANAGER         7839 19-NOV-20       2850 (null)             30
      7782 CLARK      MANAGER         7839 19-NOV-20       2450 (null)             10
      7788 SCOTT      ANALYST         7566 19-NOV-20       3000 (null)             20
      7839 KING       PRESIDENT (null)     19-NOV-20       5000 (null)             10
      7844 TURNER     SALESMAN        7698 19-NOV-20       1500          0         30
      7876 ADAMS      CLERK           7788 19-NOV-20       1100 (null)             20
      7900 JAMES      CLERK           7698 19-NOV-20        950 (null)             30
      7902 FORD       ANALYST         7566 19-NOV-20       3000 (null)             20
      7934 MILLER     CLERK           7782 19-NOV-20       1300 (null)             10

14 rows selected.

2.백업 생성
TEST@XE> create table emp_temp as
select empno,ename,job,mgr,hiredate,sal,deptno,comm
from emp;  2    3

Table created.

3.기존 테이블 DROP
TEST@XE> drop table emp purge;

Table dropped.

4.RENAME
TEST@XE> rename emp_temp to emp;

Table renamed.

5.변경 확인
TEST@XE> select * from emp;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL     DEPTNO       COMM
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 19-NOV-20        800         20 (null)
      7499 ALLEN      SALESMAN        7698 19-NOV-20       1600         30        300
      7521 WARD       SALESMAN        7698 19-NOV-20       1250         30        500
      7566 JONES      MANAGER         7839 19-NOV-20       2975         20 (null)
      7654 MARTIN     SALESMAN        7698 19-NOV-20       1250         30       1400
      7698 BLAKE      MANAGER         7839 19-NOV-20       2850         30 (null)
      7782 CLARK      MANAGER         7839 19-NOV-20       2450         10 (null)
      7788 SCOTT      ANALYST         7566 19-NOV-20       3000         20 (null)
      7839 KING       PRESIDENT (null)     19-NOV-20       5000         10 (null)
      7844 TURNER     SALESMAN        7698 19-NOV-20       1500         30          0
      7876 ADAMS      CLERK           7788 19-NOV-20       1100         20 (null)
      7900 JAMES      CLERK           7698 19-NOV-20        950         30 (null)
      7902 FORD       ANALYST         7566 19-NOV-20       3000         20 (null)
      7934 MILLER     CLERK           7782 19-NOV-20       1300         10 (null)

14 rows selected.

 

12c R1~ 

Invisible/visible 기능을 이용하여 컬럼의 순서를 변경할 수 있습니다.

 

위의 테스트와 같은 결과를 보고 싶다면 아래의 명령어로 수행하면 됩니다.

 

--컬럼 invisible

alter table emp modify deptno invisible;
alter table emp modify comm invisible;
--변경할 컬럼부터 visible
alter table emp modify comm visible;
alter table emp modify deptno visible;

 

맨 끝 컬럼인 DEPARTMENR_ID가 SALARY 뒤로 이동 된것을 확인할 수 있습니다.

0.버전 확인
TEST@ysbae> select version,instance_name from v$Instance;

VERSION           INSTANCE_NAME
----------------- ----------------
12.2.0.1.0        ysbae



1. 변경전 테이블 확인
TEST@ysbae> desc emp
 Name                                                                                                                       Null?     Type
 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 EMPLOYEE_ID                                                                                                         NUMBER(6)
 FIRST_NAME                                                                                                          VARCHAR2(20)
 LAST_NAME                                                                                                                  NOT NULL VARCHAR2(25)
 EMAIL                                                                                                                      NOT NULL VARCHAR2(25)
 PHONE_NUMBER                                                                                                        VARCHAR2(20)
 HIRE_DATE                                                                                                                  NOT NULL DATE
 JOB_ID                                                                                                                     NOT NULL VARCHAR2(10)
 SALARY                                                                                                              NUMBER(8,2)
 COMMISSION_PCT                                                                                                      NUMBER(2,2)
 MANAGER_ID                                                                                                          NUMBER(6)
 DEPARTMENT_ID                                                                                                       NUMBER(4)
 
 
 
 1.테이블 invisible
alter table emp modify DEPARTMENT_ID visible;
alter table emp modify COMMISSION_PCT visible;
alter table emp modify MANAGER_ID visible;


2.테이블 visible

alter table emp modify DEPARTMENT_ID visible;
alter table emp modify COMMISSION_PCT visible;
alter table emp modify MANAGER_ID visible;


3.바뀐 컬럼 순서 확인
TEST@ysbae> desc emp;
 Name                                                                                                                                                                   Null?     Type
 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 EMPLOYEE_ID                                                                                                                                                     NUMBER(6)
 FIRST_NAME                                                                                                                                                      VARCHAR2(20)
 LAST_NAME                                                                                                                                                              NOT NULL VARCHAR2(25)
 EMAIL                                                                                                                                                                  NOT NULL VARCHAR2(25)
 PHONE_NUMBER                                                                                                                                                    VARCHAR2(20)
 HIRE_DATE                                                                                                                                                              NOT NULL DATE
 JOB_ID                                                                                                                                                                 NOT NULL VARCHAR2(10)
 SALARY                                                                                                                                                          NUMBER(8,2)
 DEPARTMENT_ID                                                                                                                                                   NUMBER(4)
 COMMISSION_PCT                                                                                                                                                  NUMBER(2,2)
 MANAGER_ID                                                                                                                                                      NUMBER(6)

 

MySQL

Mysql의 경우에는 간단한 명령어로 변경가능합니다.

 

alter table 테이블명 modify column 컬럼명 after 이동할 위치의 앞 컬럼;

 

테스트를 통해 student 테이블의 status 컬럼을 name뒤로 이동해보도록 하겠습니다.

2번에 컬럼의 특성을 알아야 하는 이유는 default값 등 기존 특성을 그대로 가져오기 위해서입니다.  특성을 빼고 컬럼 이동 시 기존과 특성이 달라질 수 있기 때문에 주의해야 합니다.

0.버전확인
mysql> show variables like 'version';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| version       | 8.0.22 |
+---------------+--------+
1 row in set (0.00 sec)


1.테이블 확인
mysql> select * from student;
+----------+-----------+--------+-------------+--------+
| _id      | name      | belong | phone       | status |
+----------+-----------+--------+-------------+--------+
| 20090101 | 루피      | IDE    | 01112345678 |      1 |
| 20100102 | 조로      | CSE    | 01123435343 |      4 |
| 20110103 | 상디      | MSE    | 01121342443 |      1 |
| 20100204 | 버기      | ESE    | 01123424343 |      2 |
| 20110106 | 프랑키    | IME    | 01134343222 |      0 |
| 20080104 | 나미      | IDE    | 01123432432 |      6 |
| 20090105 | 쵸파      | CSE    | 01112342433 |      8 |
| 20090301 | 에릭      | ESE    | 01132424244 |      5 |
| 20090302 | 전진      | IDE    | 01112321313 |      3 |
| 20100505 | 오공      | CSE    | 01123534644 |      2 |
| 20110506 | 오천      | MSE    | 01121334525 |      8 |
| 20100507 | 베지터    | ESE    | 01123423623 |      0 |
| 20110502 | 부우      | IME    | 01134332634 |      1 |
| 20080501 | 크리링    | IDE    | 01123436346 |      2 |
| 20090503 | 피콜로    | CSE    | 01113634645 |      3 |
| 20090509 | 셀        | ESE    | 01132427535 |      0 |
+----------+-----------+--------+-------------+--------+
16 rows in set (0.00 sec)

2.컬럼확인
mysql> show columns from test.student
    -> ;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| _id    | char(9)     | YES  |     | NULL    |       |
| name   | varchar(48) | NO   |     | NULL    |       |
| belong | varchar(5)  | YES  |     | NULL    |       |
| phone  | varchar(11) | YES  |     | NULL    |       |
| status | int         | YES  |     | 0       |       |
+--------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

3.컬럼 순서 변경
mysql> alter table test.student modify column status int default 0 after name;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

4.확인
mysql> select * from test.student;
+----------+-----------+--------+--------+-------------+
| _id      | name      | status | belong | phone       |
+----------+-----------+--------+--------+-------------+
| 20090101 | 루피      |      1 | IDE    | 01112345678 |
| 20100102 | 조로      |      4 | CSE    | 01123435343 |
| 20110103 | 상디      |      1 | MSE    | 01121342443 |
| 20100204 | 버기      |      2 | ESE    | 01123424343 |
| 20110106 | 프랑키    |      0 | IME    | 01134343222 |
| 20080104 | 나미      |      6 | IDE    | 01123432432 |
| 20090105 | 쵸파      |      8 | CSE    | 01112342433 |
| 20090301 | 에릭      |      5 | ESE    | 01132424244 |
| 20090302 | 전진      |      3 | IDE    | 01112321313 |
| 20100505 | 오공      |      2 | CSE    | 01123534644 |
| 20110506 | 오천      |      8 | MSE    | 01121334525 |
| 20100507 | 베지터    |      0 | ESE    | 01123423623 |
| 20110502 | 부우      |      1 | IME    | 01134332634 |
| 20080501 | 크리링    |      2 | IDE    | 01123436346 |
| 20090503 | 피콜로    |      3 | CSE    | 01113634645 |
| 20090509 | 셀        |      0 | ESE    | 01132427535 |
+----------+-----------+--------+--------+-------------+
16 rows in set (0.00 sec)

mysql> show columns from test.student;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| _id    | char(9)     | YES  |     | NULL    |       |
| name   | varchar(48) | NO   |     | NULL    |       |
| status | int         | YES  |     | 0       |       |
| belong | varchar(5)  | YES  |     | NULL    |       |
| phone  | varchar(11) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

 

Tibero

티베로의 경우에도 Oracle의 이전 버전들과 동일하게 Drop&Create 방식으로 컬럼의 순서를 변경해야 합니다.

 

테스트입니다.

0.버전확인
SQL> select instance_name,version from v$instance;

INSTANCE_NAME                            VERSION
---------------------------------------- --------
tibero                                   6


1.변경 전 확인
SQL> /

     EMPNO ENAME      JOB              MGR HIREDATE                                                                SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ---------------------------------------------------------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 2020/08/05                                                             1111                    20
      7499 ALLEN      SALESMAN        7698 2020/08/05                                                             1111        300         30
      7521 WARD       SALESMAN        7698 2020/08/05                                                             1111        500         30
      7566 JONES      MANAGER         7839 2020/08/05                                                             1111                    20
      7654 MARTIN     SALESMAN        7698 2020/08/05                                                             1111       1400         30
      7698 BLAKE      MANAGER         7839 2020/08/05                                                             1111                    30
      7782 CLARK      MANAGER         7839 2020/08/05                                                             1111                    10
      7788 SCOTT      ANALYST         9999 2020/08/05                                                             1111                    20
      7839 KING       PRESIDENT            2020/08/05                                                             1111                    10
      7844 TURNER     SALESMAN        7698 2020/08/05                                                             1111          0         30
      7876 ADAMS      CLERK           7788 2020/08/05                                                             1111                    20
      7900 JAMES      CLERK           7698 2020/08/05                                                             1111                    30
      7902 FORD       ANALYST         7566 2020/08/05                                                             1111                    20
      7934 MILLER     CLERK           7782 2020/08/05                                                             1111                    10
      5555                                                                                                        5555

15 rows selected.


2.백업 테이블 생성
SQL> create table emp_temp as
select empno,ename,job,mgr,hiredate,sal,deptno,comm
from emp_test;    2    3

Table 'EMP_TEMP' created.

3.기존 테이블 삭제
SQL> drop table emp_Test purge;

Table 'EMP_TEST' dropped.


4.rename
SQL> rename emp_temp to emp_Test;

Renamed.

5.변경된 테이블 확인
SQL> select * from emp_test;

     EMPNO ENAME      JOB              MGR HIREDATE                                                                SAL     DEPTNO       COMM
---------- ---------- --------- ---------- ---------------------------------------------------------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 2020/08/05                                                             1111         20
      7499 ALLEN      SALESMAN        7698 2020/08/05                                                             1111         30        300
      7521 WARD       SALESMAN        7698 2020/08/05                                                             1111         30        500
      7566 JONES      MANAGER         7839 2020/08/05                                                             1111         20
      7654 MARTIN     SALESMAN        7698 2020/08/05                                                             1111         30       1400
      7698 BLAKE      MANAGER         7839 2020/08/05                                                             1111         30
      7782 CLARK      MANAGER         7839 2020/08/05                                                             1111         10
      7788 SCOTT      ANALYST         9999 2020/08/05                                                             1111         20
      7839 KING       PRESIDENT            2020/08/05                                                             1111         10
      7844 TURNER     SALESMAN        7698 2020/08/05                                                             1111         30          0
      7876 ADAMS      CLERK           7788 2020/08/05                                                             1111         20
      7900 JAMES      CLERK           7698 2020/08/05                                                             1111         30
      7902 FORD       ANALYST         7566 2020/08/05                                                             1111         20
      7934 MILLER     CLERK           7782 2020/08/05                                                             1111         10
      5555                                                                                                        5555

15 rows selected.

 

 

MSSQL

MSSQL의 경우에는 SQL server Management Studio에서 테이블 > 우클릭 > 디자인을 클릭하여 컬럼의 순서를 변경할 수 있습니다.

 

반응형

'Oracle' 카테고리의 다른 글

JOB과 관련된 명령어  (0) 2021.04.21
[DB link 시 에러] Ora-01017,Ora-02063  (2) 2021.03.23

댓글