恥知らずのウェブエンジニア -web engineer, shameless

これは一歩を踏み出すことができない者たちのブログ

もう一度向き合うmysql(4)〜プロシージャー、ファンクションなどとか〜

引き続き前回の続き。

information_schema

テーブル/インデックスとかユーザの権限などの定義情報を保存しているテーブル。
自動的にできる。mysql5.0から導入された模様。詳細は割愛!

ビュー

SELECTの結果を仮想的なテーブルのように扱う。

CREATE VIEW hoge_view AS SELECT foo, bar FROM hoge_table;

SELECT * FROM hoge.hoge_view

おおもとのhoge_tableから、foo,barカラムだけの仮想的なテーブルを作成。


ストアドプロシージャ、ストアドファンクション

複数SQLをまとめて関数のように保存。
ファンクションは戻り値あり、プロシージャは戻り値ありなし指定できる。

  • ストアドプロシージャ
DELIMITER //
CREATE PROCEDURE hoge_pro (IN x INTEGER, OUT y INTEGER)
BEGIN
    SELECT count(*) INTO y FROM hoge_table WHERE id > x;
END
//
DELIMITER ;


CALL hoge_pro(100, @y);
SELECT @y
  • ストアドファンクション
DELIMITER //
CREATE FUNCTION hoge_func (x INTEGER) RETURNS INTEGER
DETERMINISTIC
BEGIN
    DECLARE ret INTEGER;
    SET ret = x * 100;
    RETURN ret;
END
//
DELIMITER ;


UPDATE hoge_table SET id=hoge_func(id);

トリガ

特定のテーブルにINSERT,UPDAT,DELETEの処理の前後に行う処理を定義できる

DELIMITER //
CREATE TRIGGER hoge_tri
BEFORE UPDATE ON hoge_table
FOR EACH ROW
BEGIN
    INSERT INTO hoge_table_log(update_time, after_num, before_num) VALUES (CURRENT_TIMESTAMP(), NEW.num, OLD.num);
END;
//
DELIMITER ;

こんな感じで定義するとUPDATEがあるとログテーブルにレコードを自動的にインサートするように





感謝致します。
f:id:ogataka50:20140626174338j:plain