0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[playframework][evolution][mysql] キー削除(INDEX,UNIQUE,FOREIGN KEY)でIF EXISTSと同等の動きを実現する

Last updated at Posted at 2020-05-01

背景

PlayFrameworkで構築したWebアプリケーションのデータベースマイグレーションツールとしてevolutionを使用しています。
データベースはMySQL

初期に構築(して未使用だった)テーブルの定義が誤っていました。
具体的には不要なユニークキーを付与してしまっていました。(重複が発生してレコード追加できない不具合発生)

削除したいがテーブル定義を記述したスクリプトを修正するとデータが失われてしまうので追加スクリプトにDROPを記載して対応したい。

問題点

キーの削除は、UP節にalter table xxx drop key xxxで可能です。を記載すればOKです。
問題はDOWN節でCREATEできないこと(キー重複エラーになる)。

このため、UP節が2回実行されると存在しないキーを削除しようとするのでマイグレーション操作がエラーになってしまいます。

IF EXISTSはテーブルの削除(DROP TABLE)はサポートしていますがALTER TABLEではサポートされていません。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.1.7 ALTER TABLE 構文

対応策

information_schemaで存在をチェックして動的にSQL文を作成することで複数回実行してもパスするようになりました。

インデックス、ユニークキーの場合

set @tablename='テーブル名';
set @indexname='インデックス名';
set @var=if((SELECT true FROM information_schema.STATISTICS WHERE
            INDEX_SCHEMA = DATABASE() AND
            TABLE_NAME   = @tablename AND
            INDEX_NAME   = indexname) = true,concat('ALTER TABLE ', @tablename, ' drop key ', @indexname),'select 1');
prepare stmt from @var;
execute stmt;
deallocate prepare stmt;

外部キーの場合

# --- !Ups
set @tablename='テーブル名';
set @constraintname='外部キー名';
set @var=if((SELECT true FROM information_schema.table_constraints WHERE
            table_SCHEMA = database()
            and table_name = @tablename
            and constraint_type="FOREIGN KEY"
            and CONSTRAINT_NAME = @constraintname) = true,concat('ALTER TABLE ', @tablename, ' drop FOREIGN KEY ', @constraintname),'select 1');
prepare stmt from @var;
execute stmt;
deallocate prepare stmt;

参考

以下のQ&Aの上位回答のあわせ技です。

mysql - Drop foreign key only if it exists - Stack Overflow
https://stackoverflow.com/questions/17161496/drop-foreign-key-only-if-it-exists

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?