読者です 読者をやめる 読者になる 読者になる

( ꒪⌓꒪) ゆるよろ日記

( ゚∀゚)o彡°オパーイ!オパーイ! ( ;゚皿゚)ノシΣ フィンギィィーーッ!!!

MySQLで外部キーがある場合にのみDROPする方法

MySQL

今のプロジェクトでは、DDLに変更があったらHudsonでスキーマを作り直すようにしてるんですけど、
外部キーが無い場合にALTER TABLE DROP FOREIGN KEYを行うとエラーになっちゃいます。
ジョブも止まっちゃってしょんぼりなんですよ。


で、外部キー制約をのこしたままDROP TABLEすると怒られちゃうし。


で、DROP FOREIGN KEY IF EXISTSってやってみたらsyntax errorとか言われちゃってもー。
困ったさんねぇ。


だから、外部キーがある場合にのみDROPするプロシージャを作ったのよ。
このプロシージャの宣言をDDLの先頭に書いておいて、テーブル名と消したい外部キー制約名を
渡すと、外部キー制約がある場合のみ、ALTER TABLE DROP FOREIGN KEYを発行するの。

-- This Procedure is Drop Foreing key
DELIMITER $$
DROP PROCEDURE IF EXISTS DropFK $$
CREATE PROCEDURE DropFK (
  IN parm_table_name VARCHAR(100),
  IN parm_key_name VARCHAR(100)
)
BEGIN
  -- Verify the foreign key exists
  IF EXISTS (SELECT NULL FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = DATABASE() AND CONSTRAINT_NAME = parm_key_name) THEN
    -- Turn the parameters into local variables
    set @ParmTable = parm_table_name ;
    set @ParmKey = parm_key_name ;
    -- Create the full statement to execute
    set @StatementToExecute = concat('ALTER TABLE `',@ParmTable,'` DROP FOREIGN KEY `',@ParmKey,'`');
    -- Prepare and execute the statement that was built
    prepare DynamicStatement from @StatementToExecute ;
    execute DynamicStatement ;
    -- Cleanup the prepared statement
    deallocate prepare DynamicStatement ;
  END IF;
END $$
DELIMITER ; $$


使い方はこんな感じ。

CALL DropFK('テーブル名','外部キー制約名');

ここを参考にちょっと修正してるの。
http://forums.mysql.com/read.php?97,218825,247526