ドキュメント
https://dev.mysql.com/doc/refman/8.4/en/rename-table.html
検証
以下のような2つのテーブルがあるとします。sample_order テーブルは sample_user(id) を外部キー制約として持っています。
CREATE TABLE sample_user (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE=InnoDB;
CREATE TABLE sample_order (
order_id INT NOT NULL AUTO_INCREMENT,
user_id INT,
order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (order_id),
CONSTRAINT sample_order_ibfk_1 FOREIGN KEY (user_id) REFERENCES sample_user(id)
) ENGINE=InnoDB;ここで、sample_order_new を作成して、sample_orderと入れ替えます。
-- テーブル生成
CREATE TABLE sample_order_new (
order_id INT NOT NULL AUTO_INCREMENT,
user_id INT,
order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (order_id),
CONSTRAINT sample_order_new_ibfk_1 FOREIGN KEY (user_id) REFERENCES sample_user(id)
) ENGINE=InnoDB;
-- rename
RENAME TABLE
sample_order TO sample_order_old,
sample_order_new TO sample_order;この場合、テーブルの名前は変更されますが、外部キーに付けている名前はどうなるのでしょうか?実際に確認してみると、外部キー制約の名前もsample_order_old_ibfk_1に変換されていました。
CREATE TABLE `sample_order_old` (
`order_id` int NOT NULL AUTO_INCREMENT,
`user_id` int DEFAULT NULL,
`order_date` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`order_id`),
KEY `sample_order_ibfk_1` (`user_id`),
CONSTRAINT `sample_order_old_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `sample_user_old` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ciドキュメントを確認すると、外部キー名にtbl_name_ibfk_をつけていると、外部キーも変換する動作になっているようです。CHECK制約も同様で、 tbl_name_chk_を名前につけておくと、変換されます。
RENAME TABLE tbl_name TO new_tbl_name changes internally generated foreign key constraint names and user-defined foreign key constraint names that begin with the string “tbl_name_ibfk_” to reflect the new table name. InnoDB interprets foreign key constraint names that begin with the string “tbl_name_ibfk_” as internally generated names.