Loading...
MySQL 9.5 Reference Manual 9.5의 15.1.41 RENAME TABLE Statement의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
1RENAME TABLE 2 tbl_name TO new_tbl_name 3 [, tbl_name2 TO new_tbl_name2] ...
RENAME TABLE은 하나 이상의 테이블 이름을 변경합니다. 원래 테이블에 대해서는 ALTER와
DROP 프리빌리지가 필요하고, 새 테이블에 대해서는
CREATE와
INSERT 프리빌리지가 필요합니다.
예를 들어, old_table이라는 테이블의 이름을
new_table로 변경하려면 다음 스테이트먼트를 사용합니다:
1RENAME TABLE old_table TO new_table;
이 스테이트먼트는 다음의
ALTER TABLE 스테이트먼트와 동일합니다:
1ALTER TABLE old_table RENAME new_table;
RENAME TABLE은 ALTER TABLE과는 달리 하나의 스테이트먼트에서 여러 개의 테이블 이름을 변경할 수 있습니다:
1RENAME TABLE old_table1 TO new_table1, 2 old_table2 TO new_table2, 3 old_table3 TO new_table3;
이름 변경 작업은 왼쪽에서 오른쪽 순서로 수행됩니다. 따라서 두 테이블 이름을 서로 바꾸려면 (중간 이름인
tmp_table을 사용하는 테이블이 이미 존재하지 않는다고 가정하고) 다음과 같이 합니다:
1RENAME TABLE old_table TO tmp_table, 2 new_table TO old_table, 3 tmp_table TO new_table;
테이블에 대한 메타데이터 락은 이름 순서대로 획득되며, 이로 인해 여러 트랜잭션이 동시에 실행되는 경우 동작 결과에 차이가 발생할 수 있습니다. 자세한 내용은 Section 10.11.4, “Metadata Locking”을 참조하십시오.
LOCK TABLES 스테이트먼트로 락된 테이블도 이름을 변경할 수 있지만, WRITE 락이 걸려 있거나, 다중 테이블 이름 변경 작업의 이전 단계에서
WRITE 락이 걸린 테이블의 이름 변경 결과로 생성된 테이블이어야 합니다. 예를 들어, 다음은 허용됩니다:
1LOCK TABLE old_table1 WRITE; 2RENAME TABLE old_table1 TO new_table1, 3 new_table1 TO new_table2;
다음은 허용되지 않습니다:
1LOCK TABLE old_table1 READ; 2RENAME TABLE old_table1 TO new_table1, 3 new_table1 TO new_table2;
트랜잭션 테이블 락킹 조건이 충족되면, 이름 변경 작업은 원자적으로 수행되며, 이름 변경이 진행되는 동안 다른 세션은 해당 테이블들에 접근할 수 없습니다.
RENAME TABLE 동안 오류가 발생하면
스테이트먼트는 실패하고 아무런 변경도 이루어지지 않습니다.
RENAME TABLE을 사용하여 테이블을 한 데이터베이스에서 다른 데이터베이스로 이동할 수 있습니다:
1RENAME TABLE current_db.tbl_name TO other_db.tbl_name;
이 방법으로 한 데이터베이스의 모든 테이블을 다른 데이터베이스로 이동하면 (MySQL에는 이를 위한 단일 스테이트먼트가 없기 때문에) 결과적으로 데이터베이스의 이름을 바꾸는 효과가 있지만, 원래 데이터베이스는 테이블이 없는 상태로 계속 존재합니다.
RENAME TABLE과 마찬가지로, ALTER TABLE ... RENAME 역시 테이블을 다른 데이터베이스로 이동하는 데 사용할 수 있습니다. 어떤 스테이트먼트를 사용하든, 이름 변경 작업으로 인해 테이블이 다른 파일 시스템에 위치한 데이터베이스로 이동하게 되는 경우, 결과의 성공 여부는 플랫폼에 따라 다르며, 테이블 파일을 이동하는 데 사용되는 기본 운영 체제 호출에 좌우됩니다.
테이블에 트리거가 있는 경우, 해당 테이블을 다른 데이터베이스로 이름 변경하려는 시도는 Trigger in wrong
schema
(ER_TRG_IN_WRONG_SCHEMA) 오류와 함께 실패합니다.
암호화되지 않은 테이블은 암호화가 활성화된 데이터베이스로 이동할 수 있고 그 반대도 가능합니다. 그러나
table_encryption_privilege_check
변수가 활성화되어 있는 경우, 테이블 암호화 설정이 기본 데이터베이스 암호화와 다르면
TABLE_ENCRYPTION_ADMIN 프리빌리지가 필요합니다.
TEMPORARY 테이블의 이름을 변경하기 위해서는 RENAME TABLE을 사용할 수 없습니다. 대신 ALTER TABLE을 사용하십시오.
RENAME TABLE은 뷰에서도 동작하지만,
뷰는 다른 데이터베이스로 이름을 변경할 수는 없습니다.
이름이 변경된 테이블이나 뷰에 대해 명시적으로 부여된 프리빌리지는 새 이름으로 이전되지 않습니다. 수동으로 변경해야 합니다.
RENAME TABLE tbl_name TO new_tbl_name은 내부적으로 생성된 외래 키 제약 조건 이름과, 문자열
“tbl_name_ibfk_”로 시작하는 사용자 정의 외래 키 제약 조건 이름을 새 테이블 이름을 반영하도록 변경합니다. InnoDB는
“tbl_name_ibfk_”로 시작하는 외래 키 제약 조건 이름을 내부적으로 생성된 이름으로 해석합니다.
이름이 변경된 테이블을 가리키는 외래 키 제약 조건 이름도 자동으로 갱신되지만, 충돌이 발생하면 스테이트먼트는 오류와 함께 실패합니다. 충돌은 변경된 제약 조건 이름이 이미 존재하는 경우에 발생합니다. 이런 경우, 외래 키가 올바르게 동작하도록 다시 드롭하고 재생성해야 합니다.
RENAME TABLE tbl_name TO new_tbl_name은 문자열
“tbl_name_chk_”로 시작하는 내부적으로 생성된 CHECK
제약 조건 이름과 사용자 정의 CHECK
제약 조건 이름을 새 테이블 이름을 반영하도록 변경합니다. MySQL은
“tbl_name_chk_”로 시작하는 CHECK
제약 조건 이름을 내부적으로 생성된 이름으로 해석합니다. 예시는 다음과 같습니다:
1mysql> SHOW CREATE TABLE t1\G 2*************************** 1. row *************************** 3 Table: t1 4Create Table: CREATE TABLE `t1` ( 5 `i1` int(11) DEFAULT NULL, 6 `i2` int(11) DEFAULT NULL, 7 CONSTRAINT `t1_chk_1` CHECK ((`i1` > 0)), 8 CONSTRAINT `t1_chk_2` CHECK ((`i2` < 0)) 9) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 101 row in set (0.02 sec) 11 12mysql> RENAME TABLE t1 TO t3; 13Query OK, 0 rows affected (0.03 sec) 14 15mysql> SHOW CREATE TABLE t3\G 16*************************** 1. row *************************** 17 Table: t3 18Create Table: CREATE TABLE `t3` ( 19 `i1` int(11) DEFAULT NULL, 20 `i2` int(11) DEFAULT NULL, 21 CONSTRAINT `t3_chk_1` CHECK ((`i1` > 0)), 22 CONSTRAINT `t3_chk_2` CHECK ((`i2` < 0)) 23) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 241 row in set (0.01 sec)
15.1.40 DROP VIEW Statement
15.1.42 TRUNCATE TABLE Statement