【猿でもわかるMysql】 alter table add colum if not existsを実装する
CREATE TABLE IF NOT EXISTSってありますよね。 もし、テーブルが存在していなければ、テーブルを追加するという処理。 カラムでは、その処理が行えないために、 既にカラムが存在していますとエラー(ERROR 1060 (42S21): Duplicate column name ”)が表示され、後続処理も止まってしまうなど、 困らされているので、カラムにもIF NOT EXISTを実装してやろうと思います。 参考にした記事はこちらです。 https://qiita.com/jas/items/0ffe72a96c3f8b6cf6dc 凄くわかりやすい記事なのですが、 プロシージャなにそれという人のために解説しながら進めていきます。 まず、プロシージャとは… 値を返さない処理のまとまりのことです。 値を返すものをファンクションと呼びます。 その処理のまとまりを作成し、実行することで、 alter table add colum if not existsを実現しています。
実装する
プロシージャが存在していれば削除。 これから作成するプロシージャ名と被らないようにしておきます。
DROP PROCEDURE IF EXISTS alter_table_procedure;
デリミタとは区切り文字のことです。 ここでは、文末につける ; を // に変えています。 デリミタを変更することで複数の処理をまとめることができます。
DELIMITER //
デリミタが変更になっているので、 // までで一つの文章です。 この処理を実行すると、エラーが発生しても、エラーを出さない。上書きしてしまうこともないので、 もし、存在すれば、という処理が実行できることになります。 ALTER TABLE …の部分は必要に応じ、書き換えてください。
CREATE PROCEDURE alter_table_procedure()
BEGIN
/* SQLEXCEPTIONを無視するように設定 */
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
/* 以下のALTER TABLEで『Duplicate column name』エラーが発生してもプロシージャは正常終了する */
ALTER TABLE user ADD COLUMN age INT NULL AFTER name;
ALTER TABLE user ADD COLUMN address VARCHAR(50) NULL AFTER age;
END //
デリミタを戻しています。 これを戻し忘れると、文末に // をつけないと処理を実行できなくなります。 mysqlにアクセスしなおすことでも、デフォルトに戻ります。
DELIMITER ;
一応、作成されているか確認してみましょう。
SHOW PROCEDURE STATUS;
プロシージャを呼び出しています。
CALL alter_table_procedure();
作成したプロシージャを削除しています。
DROP PROCEDURE alter_table_procedure;
SELECTすることで、もしカラムが追加できていない(存在しない場合) ERROR 1054 (42S22): Unknown column ” in ‘field list’ のエラーが起き、知らせてくれます。 最後にlimit 0 というのをつけたのは取得するレコードの数を0件にするためです。 もし、既に存在していたカラムでデータが入っていた場合に、大量のデータがSELECTされてしまう恐れがあるからです。 存在すれば、Empty set (0.00 sec)が返ります。
SELECT age, address FROM user limit 0;