Today
Total
KoreanEnglishFrenchGermanJapaneseSpanishChinese (Simplified)
관리 메뉴

DB & AWS Knowledge

PostgreSQL 명령어 : ALTER - RENAME 본문

PostgreSQL/명령어

PostgreSQL 명령어 : ALTER - RENAME

`O` 2021. 6. 22. 01:53
728x90
반응형

해당 페이지에서는 PostgreSQL 의 ALTER 구문 중 RENAME 명령어에 대해서 다룬다.

 

참조 페이지

 

https://www.postgresql.org/docs/12/sql-altertable.html

 

연관 페이지 (해당 페이지를 읽기전 아래의 링크를 한번 읽고 오면 좋다.)

 

2021.06.21 - [MySQL/명령어] - MySQL/MariaDB 명령어 : RENAME TABLE

2021.03.08 - [PostgreSQL/기타 지식] - PostgreSQL / PPAS 테이블 rename 시 동일 인덱스 적용 가능 유무

2021.03.07 - [PostgreSQL/파티셔닝] - PostgreSQL 및 PPAS 간의 생성 차이

 

 

ALTER - RENAME 명령어의 의의

 

RENAME 은 말 그대로 테이블등의 DB 객체 이름을 변경하는 명령어다. 개발이나 기타 테스트등의 목적으로 테스트 객체들을 생성하다보면, 객체 이름을 잘못 명명했거나 내부 규정등의 기타 사유로 이름을 변경해야 할 경우가 있다.

 

물론 DROP 으로 완전 삭제하고 다시 만드는 방법이 있으나 실제로 객체내에 대량의 데이터가 들어가 있어서 DROP 을 하고 다시 생성을 하게 되면 데이터를 다시 기입하거나 DROP 전, 원하는 객체의 형상을 다시 맞춘 후, 이전에 추출한 객체의 데이터를 다시 import 하는 등의 방법으로 시간을 들여서 데이터를 넣어야 한다. 그러한 데이터 기입 시간 절약 및 데이터 보존에 있어서 RENAME 은 매우 좋은 전략 중에 하나다.

 

PostgreSQL 에서는 index, sequence, view, materialized view, or foreign table 의 객체명칭들을 모두 RENAME 으로 바꿀 수 있다.

 

 

RENAME 명령어 예시 및 주의사항

 

공식 Document 에 따른 RENAME 명령어 syntax 예시는 아래와 같다.

(위의 링크를 보면 다른 예시들도 있으나 이 예시만으로 해당 명령어를 설명 할 수 있으므로 생략)

 

ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
    RENAME [ COLUMN ] column_name TO new_column_name
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
    RENAME CONSTRAINT constraint_name TO new_constraint_name
ALTER TABLE [ IF EXISTS ] name
    RENAME TO new_name

 

PostgreSQL 에서는 MySQL / MariaDB 와 다르게 ALTER 구문에 RENAME 이 종속되어 있다. PostgreSQL 의 좋은 기능중 하나는 리눅스와 유사하게 ALTER 등의 기본 명령어를 입력 후 TAB 을 사용하면 그 뒤에 올 수 있는 명령어나 객체들을 모두 보여 주는데 이를 잘 사용 하면 오타없이 정확한 명칭 변경 작업을 수행 할 수 있다.

 

PostgreSQL 은 RENAME 시 주의 사항이 있는데, 파티션 테이블이 타 RDBMS 와는 다르게 독립 객체이므로 RENAME TABLE 작업 시, 다른 파티션 테이블 명칭도 이에 따른 변경이 되지 않기에 각각의 RENAME 작업을 병행 하는것을 고려해야한다.

 

예시를 들면 아래와 같다.

 

먼저 PostgreSQL 에서 아래와 같은 테이블을 생성한다.

 

#테이블 생성 (DB 및 schema 는 test 로 미리 생성) 

postgres=# CREATE TABLE test.wwwlog
postgres-# (
postgres(# seq serial not null,
postgres(# ctime timestamp not null default current_timestamp,
postgres(# node bigint not null,
postgres(# data jsonb not null
postgres(# );
CREATE TABLE

#파티션 생성 

postgres=# CREATE TABLE test.wwwlog_20180111
postgres-# (
postgres(# PRIMARY KEY (seq),
postgres(# CHECK (ctime >= '2018-01-11 00:00:00' AND ctime < '2018-01-12 00:00:00')
postgres(# ) INHERITS (test.wwwlog);
ERROR:  relation "wwwlog_20180111" already exists

#테이블 조회 

postgres-# \dS+ test.wwwlog
                                                              Table "test.wwwlog"
 Column |            Type             | Collation | Nullable |                 Default                  | Storage  | Stats target | Description
--------+-----------------------------+-----------+----------+------------------------------------------+----------+--------------+-------------
 seq    | integer                     |           | not null | nextval('test.wwwlog_seq_seq'::regclass) | plain    |              |
 ctime  | timestamp without time zone |           | not null | CURRENT_TIMESTAMP                        | plain    |              |
 node   | bigint                      |           | not null |                                          | plain    |              |
 data   | jsonb                       |           | not null |                                          | extended |              |
Child tables: test.wwwlog_20180111

 

여기서 rename 후, 파티션 테이블 명칭을 확인 해 본다.

 

#원본 테이블 이름 변경 및 테이블 확인 

postgres-# alter table test.wwwlog rename TO wwwlog_bak; 
ALTER TABLE 

postgres-# \dS+ test.wwwlog_bak;
                                                            Table "test.wwwlog_bak"
 Column |            Type             | Collation | Nullable |                 Default                  | Storage  | Stats target | Description
--------+-----------------------------+-----------+----------+------------------------------------------+----------+--------------+-------------
 seq    | integer                     |           | not null | nextval('test.wwwlog_seq_seq'::regclass) | plain    |              |
 ctime  | timestamp without time zone |           | not null | CURRENT_TIMESTAMP                        | plain    |              |
 node   | bigint                      |           | not null |                                          | plain    |              |
 data   | jsonb                       |           | not null |                                          | extended |              |
Child tables: test.wwwlog_20180111

 

이제 이 상태에서 원본테이블의 변경 전 이름이었던 wwwLOG 및 파티션 테이블을 다시 생성해 본다.

 

#원본 테이블의 변경 전 명칭으로 다시 테이블 생성 

postgres=# CREATE TABLE test.wwwlog
postgres-# (
postgres(# seq serial not null,
postgres(# ctime timestamp not null default current_timestamp,
postgres(# node bigint not null,
postgres(# data jsonb not null
postgres(# );
CREATE TABLE

#동일 명칭의 파티션 테이블 명령어 수행 및 결과 확인 

postgres=# CREATE TABLE test.wwwlog_20180111
postgres-# (
postgres(# PRIMARY KEY (seq),
postgres(# CHECK (ctime >= '2018-01-11 00:00:00' AND ctime < '2018-01-12 00:00:00')
postgres(# ) INHERITS (test.wwwlog);
ERROR:  relation "wwwlog_20180111" already exists

 

결과를 보면 MySQL / MariaDB 와는 다르게 파티션테이블이 이미 독립적인 동일 테이블명으로 있어서 생성이 실패한다.

 

이러한 이유가 있기 때문에, 기존 테이블 명칭을 바꾸고 기존 테이블의 이름을 따르는 다른 구조의 테이블을 다시 생성 시, 파티션 테이블도 다른 구조로 만들고 싶다면 기존 파티션 테이블의 명칭도 RENAME 으로 바꿔야한다.

 

테스트 구문을 넣지 않았지만 index 또한 MySQL / MariaDB 와는 다르게 독립 객체로 분류 되기에, 테이블과 같이 명칭 변경에 대한 관리 포인트가 있다. (위의 동일 인덱스 적용 가능 유무 링크 확인)

반응형
Comments