테이블 컬럼의 순서를 변경하는 방법에 대해서 각 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 |
댓글