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