現場データサイエンティスト奮闘記

とある企業で働くデータサイエンティストの日々のアウトプット

MySQLでカラムを追加して外部キーを付け替えるときの手順

状況

以下のような状況を想定して外部キー付け替えの手順をメモします。

users テーブルには id , uid の2カラムがあります。
posts テーブルには user_id カラムがあり、これが users.id を参照する外部キーとなっています。
また、 posts テーブルには uid カラムがありません。

ここで、 posts テーブルに uid カラムを追加し、これを users.id を参照する外部キーに設定し、既存の posts.user_id はカラムごと削除します。

手順

1. posts テーブルに uid カラムの作成

ALTER TABLE posts ADD uid VARCHAR(255);

2. posts.uid カラムに値を挿入

外部キーを貼った際に整合性の取れないデータが入っているとエラーになるので先に値を入れておきます。

UPDATE posts, users SET posts.uid = users.uid WHERE posts.user_id = users.id;

3. 既存の posts.user_id の外部キー制約を解除する

SHOW CREATE TABLE posts;

を実行します。中に、

CONSTRAINT `posts_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)

のような行があるので posts_ibfk_1 の値をメモします。
以下を実行して外部キー制約を外します。

ALTER TABLE posts DROP FOREIGN KEY posts_ibfk_1;

4. posts.user_id カラムを削除する

外部キーの制約が外れているので普通に削除できます。

ALTER TABLE posts DROP user_id;

5. posts.uid の外部キーの設定を行う

ALTER TABLE posts ADD FOREIGN KEY (uid) REFERENCES users (uid);