質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

4回答

4204閲覧

MySQLで存在しないファンクションを作成する構文ってありますか?

yamaguchi

総合スコア20

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2016/10/17 03:54

###前提・実現したいこと
MySQLでCREATE FUNCTIONするさいに、そのFUNCTIONが存在しない場合のみCREATEを実行したいです。
要するに、CREATE FUNCTIONでIF NOT EXISTS的な構文で実行したいです。
IF NOT EXISTSが利用できなくとも、同等の挙動になるような解決策はないでしょうか。

###発生している問題・エラーメッセージ
DROP FUNCTIONではIF EXISTSが構文的に許容されるが、CREATE FUNCTIONだと構文エラーになってしまう。

###試したこと
CREATE FUNCTIONにもIF NOT EXISTSつけて実行してみたが構文エラーになりました。
MySQLのサイトを見てもDROPだとIF EXISTSができますが、CREATEでは何も触れられてなかった。
仕様的に無理そうな気がします。

###補足情報(言語/FW/ツール等のバージョンなど)
MySQLのバージョンは5.6.22です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

普通、名前が競合していたらfunctionをつくらないという状況は考えづらく

  • 競合していない前提でつくろうとしてエラー
  • 競合しているかもしれないので削除してから作成

のどちらかですよね?
後者はDROP FUNCTION IF EXISTSにあたります。

投稿2016/10/17 04:40

yambejp

総合スコア117719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamaguchi

2016/10/17 05:50

今回は都合により、DROP FUNCTION IF EXISTSは利用できない状況なのでこのような質問をさせて頂きました。
yambejp

2016/10/17 07:03

事前にあるかどうか確認したいなら show function status where Name='関数名' でチェックすればいいし 競合したままcreate functionしてエラーを吐かせてもいいのでは? 結局もし競合した場合、その関数を実行すると 想定外の動作になってしまうので、運用方法考え直したほうが よいと思いますが・・・
guest

0

CREATE FUNCTION 単体では、DROP FUNCTION のように IF EXISTS の処理はないようですね。
他の回答にあるようにシステムテーブルから判断するとしても、なんとなく冗長に感じるので、DROP FUNCTIONしてからCREATE FUNCTIONでいいと思います。
もしくは DECLARE...HANDLERで例外処理して無視するとか。
環境がないので試せてませんが、こんな感じで動きますかね?

SQL

1DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; 2CREATE FUNCTION ...

投稿2016/10/17 04:46

ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamaguchi

2016/10/17 05:49

ありがとうございます。 シンプルでとても良い感じですが、構文エラーとなり実行できませんでした。 CREATE PROCEDURE でなくとも実行できるものなのでしょうか。
ttyp03

2016/10/17 05:57

DECLARE HANDLER は単なる例外処理なので、対象はなんでも良いと思います。 (ストアド実行内で発生した例外をハンドルする) 回答したものの自分自身使ったことがないので憶測です。すみません。 また手元に環境がないので試すこともできないので、あとは自力でお願いします。 DECLARE HANDLER のサンプルはググればたくさん出てきますので。
guest

0

システムテーブルを参照すればよい?
IF NOT EXISTS(SELECT 1 FROM mysql.proc p WHERE db = 'db_name' AND name = 'stored_proc_name') THEN
....
END IF;

引用です
http://stackoverflow.com/questions/9948713/how-to-say-create-procedure-if-not-exist-in-mysql

投稿2016/10/17 04:06

katsuya141

総合スコア367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamaguchi

2016/10/17 05:54

以下のようなクエリをGUIツールから実行してみましたが、構文エラーになってしまいました。どこがいけないのでしょう(select単体では成功します)。 IF NOT EXISTS(SELECT 1 FROM mysql.proc p WHERE db = 'db_name' AND name = 'stored_proc_name') THEN select 'OK' END IF;
guest

0

※実際には以下のリンク先の方法は使えませんでした。IF文をストアドプログラム以外では使えないためです。制御部分を別のプログラムかシェル等でやればできなくはないですが...

mysql.procに定義があるかないか判断すればできそうですね。
参考:how to say create procedure if not exist in MySQL

※functionもmysql.procに定義があるようなので、同じSQLでいけると思います。

投稿2016/10/17 04:05

編集2016/10/17 08:26
popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamaguchi

2016/10/17 05:54

以下のようなクエリをGUIツールから実行してみましたが、構文エラーになってしまいました。どこがいけないのでしょう(select単体では成功します)。 IF NOT EXISTS(SELECT 1 FROM mysql.proc p WHERE db = 'db_name' AND name = 'stored_proc_name') THEN select 'OK' END IF;
popobot

2016/10/17 07:23

すみません、selectまで確認して、ifの方がやっていなかったです。今やったらうまくいかないですね...。よくよく考えるとIF文はfunctionやprocedure以外で使えるか微妙ですね...。もう少し調べてみます!
popobot

2016/10/17 08:25 編集

マニュアル等を見てもできなさそうですね。IF文はストアドプログラム等でしか使えないので、この方法は使えないと思います。古い記事で同じような記述があるので、古いバージョンではできたのかもしません。 他に方法がないか考えたんですが...ちょっと見つからなかったです、すみませんでした。 代替案としては、他の言語かシェル等を使えばいくらでも制御はできると思いますが...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問