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;