ドキュメント

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.