ITMySQL

【猿でもわかる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;