MS SQLなどだとSP_RENAMEなどのストアドプロシジャーを利用してテーブル名を変更していましたが、
MYSQLはやはり、オラクルのよりのDBなのでオラクルと同じように
”ALTER TABLE 既存テーブル名 RENAME TO 新規テーブル名;”で変更してあげるようです。
テーブル名の変更はあまり頻度の高い操作ではありませんが、データのフラグメンテーションを
解消するために別テーブルを作成しておいて、メンテナンスと同時に名前を変更して切り替える…………
年度毎にテーブル名を変更して、空の新しいテーブルに新年度からのデータを入れるなど……..
色々と便利ば利用方法もありますので、いざという時に直ぐに思い出せるようにメモしておきます。

——————————————————————
MYSQLでのテーブルのRENAMEの方法①
——————————————————————


mysql> use STUDY
Database changed
mysql> show tables;
+------------------+
| Tables_in_STUDY |
+------------------+
| T1 |
| TIMESTAMP_FUNC |
| Y2008 |
| Y2009 |
| Y2010 |
+------------------+
16 rows in set (0.13 sec)

mysql> desc T1;
+-------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+----------------+
| id | tinyint(4) | NO | PRI | NULL | auto_increment |
+-------+------------+------+-----+---------+----------------+
1 row in set (0.06 sec)

mysql> ALTER TABLE T1 RENAME TO K1;
Query OK, 0 rows affected (0.04 sec)

mysql> desc K1;
+-------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+----------------+
| id | tinyint(4) | NO | PRI | NULL | auto_increment |
+-------+------------+------+-----+---------+----------------+
1 row in set (0.00 sec)

mysql> show tables;
+------------------+
| Tables_in_STUDY |
+------------------+
| K1 |
| TIMESTAMP_FUNC |
| Y2008 |
| Y2009 |
| Y2010 |
+------------------+
16 rows in set (0.01 sec)

mysql>

alter_rename

——————————————————————
MYSQLでのテーブルのRENAMEの方法②
——————————————————————


mysql> desc STUDY.test_col;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| col1 | int(4) unsigned | YES | | NULL | |
| col2 | int(4) unsigned zerofill | YES | | NULL | |
+-------+--------------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> RENAME TABLE STUDY.test_col TO STUDY.RENAME_TEST;
Query OK, 0 rows affected (0.01 sec)

mysql> desc STUDY.RENAME_TEST;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| col1 | int(4) unsigned | YES | | NULL | |
| col2 | int(4) unsigned zerofill | YES | | NULL | |
+-------+--------------------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql>

rename_table

※ MYISAM, INNODBともに*.frmファイルの名前はRENAMEと同時に自動で変わります。
尚、MYISAMのデータファイルなども同じくファイル名も自動で変わるようです。

RENAME_TEST.frm
RENAME_TEST.MYD
RENAME_TEST.MYI

————————————————
参考サイト
————————————————
12.1.19. RENAME TABLE 構文

このステートメントは1つ、または複数のテーブルのリネームをします。

RENAME TABLE tbl_name TO new_tbl_name [, tbl_name2 TO new_tbl_name2] ...

リネームは自動的に行われますので、その他のスレッドはリネーム作業中はどのテーブルにも
アクセスできません。例えば、もし既存テーブル old_table があるとしたら、同じ構成で中身が
空の別のテーブル new_table を作成し、その後、次のように既存テーブルと空のテーブルを
入れ替える事ができます。(backup_table は存在していないと仮定する):


CREATE TABLE new_table (...);
RENAME TABLE old_table TO backup_table, new_table TO old_table;

もしこのステートメントが複数のテーブルをリネームすると、残りの作業は左から右に行われます。
もし2つのテーブル名の入れ替えをしたければ、このように行う事ができます。(tmp_table が存在しないと仮定):


RENAME TABLE old_table TO tmp_table,
new_table TO old_table,
tmp_table TO new_table;

2つのデータベースが同じファイル システム上にある限り、テーブルを1つのデータベースから
別のDBに移動するのに RENAME TABLE を利用する事ができます。

RENAME TABLE current_db.tbl_name TO other_db.tbl_name;

リネームされたテーブルやビューに与えられた権限は、新しい名前に移動しません。
それらは手動で変更しなければいけません。

※ 実証確認
権限テーブルは、テーブル名変更前も変更後も同じ名前で残っている事を確認。

mysql> select Host,User,DB,Table_name,Table_priv from tables_priv where User = 'restrict_user';
+------+---------------+-------+-------------+------------+
| Host | User | DB | Table_name | Table_priv |
+------+---------------+-------+-------------+------------+
| % | restrict_user | STUDY | RENAME_TEST | Select |
+------+---------------+-------+-------------+------------+
1 row in set (0.00 sec)

mysql> RENAME TABLE STUDY.RENAME_TEST TO TEST.RENAME_TEST;
Query OK, 0 rows affected (0.00 sec)

mysql> select Host,User,DB,Table_name,Table_priv from tables_priv where User = 'restrict_user';
+------+---------------+-------+-------------+------------+
| Host | User | DB | Table_name | Table_priv |
+------+---------------+-------+-------------+------------+
| % | restrict_user | STUDY | RENAME_TEST | Select |
+------+---------------+-------+-------------+------------+
1 row in set (0.00 sec)

mysql>

rename_to_other_db

テーブルは別DBに移動していて、ファイル自体もフォルダーが移動している事を確認。
rename_test

RENAMEにて関わるその他の情報

複数テーブルQuery1つでまとめてリネーム


mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| A1 |
| T_SiteResponse |
| innodb_monitor |
+----------------+
3 rows in set (0.00 sec)

mysql> rename table A1 to A10,T_SiteResponse to T10;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| A10 |
| T10 |
| innodb_monitor |
+----------------+
3 rows in set (0.00 sec)

rename

TEMPORARY TABLEをリネームするにはRENAME TABLE は使えない


mysql> CREATE TEMPORARY TABLE t1 (i INT);
ERROR 1050 (42S01): Table 't1' already exists
mysql> drop table t1;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TEMPORARY TABLE T1 (i INT);
Query OK, 0 rows affected (0.00 sec)

mysql> rename table T1 to T100;
ERROR 1017 (HY000): Can't find file: './test/T1.frm' (errno: 2)
mysql> ALTER TABLE T1 RENAME TO T100;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql>

alter_rename1

Comments are closed.

Post Navigation