MySQLで外部キーがある場合にのみDROPする方法
今のプロジェクトでは、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