MySqlデータベーストリガーの使用方法

WBOY
リリース: 2023-05-27 10:02:07
転載
2738 人が閲覧しました

    1. はじめに

    1. トリガーは特別なストアド プロシージャです。トリガーはストアド プロシージャと同様、特定の関数を実行できる SQL フラグメントであり、データベース サーバーに保存されます。ただし、トリガーはサイレントに呼び出されます。データベース テーブル内のデータに対して DML 操作が実行されると、実行はこの SQL フラグメントの転送は、手動操作なしで自動的にトリガーされます。

    2. MySql では、トリガーの実行は、挿入、削除、および更新操作が実行される場合にのみトリガーできます。

    3. トリガーのこの機能は、アプリケーションがサーバー上のデータ セキュリティを確保するのに役立ちます。データベース側。整合性、ロギング、データ検証、およびその他の操作

    4. エイリアス OLD および NEW を使用して、トリガー内の変更されたレコードの内容を参照します。これは他のデータベースと同様です。現在、トリガーは行のみをサポートしています。 . レベル トリガー、ステートメント レベル トリガーはサポートされていません

    2. 操作

    1. テーブル データの準備

    # 用户表
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for users
    -- ----------------------------
    DROP TABLE IF EXISTS `users`;
    CREATE TABLE `users`  (
      `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名',
      `sex` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '性别',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
    
    SET FOREIGN_KEY_CHECKS = 1;
    
    
    # 用户操作日志表
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for user_log
    -- ----------------------------
    DROP TABLE IF EXISTS `user_log`;
    CREATE TABLE `user_log`  (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
      `create_time` datetime(0) DEFAULT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
    
    SET FOREIGN_KEY_CHECKS = 1;
    ログイン後にコピー

    2. トリガー形式

    # 创建只有一个执行语句的触发器
    
    create trigger 触发器名 before|after 触发事件
    on 表名 for each row
    执行语句;
    
    # 创建有多个执行语句的触发器
    
    create trigger 触发器名 before|after 触发事件
    on 表名 for each row
    begin  
       执行语句列表
    end;
    ログイン後にコピー

    3.オペレーション

    drop TRIGGER if EXISTS TRIGGER_test;
    -- 需求1:当users表添加一行数据,则会自动在user_log添加日志记录
    delimiter $$
    CREATE TRIGGER TRIGGER_test after INSERT
    on users FOR EACH ROW
    BEGIN
    INSERT INTO user_log(content,create_time) VALUES('添加了一条数据',NOW());
    end $$
    delimiter ;
    
    INSERT INTO users(user_name,sex) VALUES('xiaohemaio','男');
    
    
    -- 需求2:当users表修改一行数据,则会自动在user_log添加日志记录
    drop TRIGGER if EXISTS TRIGGER_test1;
    
    delimiter $$
    CREATE TRIGGER TRIGGER_test1  BEFORE UPDATE
    on users FOR EACH ROW
    BEGIN
    INSERT INTO user_log(content,create_time) VALUES('修改了一条数据',NOW());
    end $$
    delimiter ;
    
    update users set user_name='迪丽热巴' WHERE id=3;
    ログイン後にコピー

    3. トリガー NEW と OLD

    NEW と OLD の使用は MySql で定義されており、トリガーが配置されているテーブル内でトリガーをトリガーしたデータの行を表すために使用されます。トリガーで変更されたレコードの内容を参照します。

    MySqlデータベーストリガーの使用方法

    使用法: NEW.columnName (columnName は、対応するデータ テーブル内の列の名前です)

    1. ケース

    -- 案例一
    drop TRIGGER if EXISTS TRIGGER_test2;
    
    delimiter $$
    CREATE TRIGGER TRIGGER_test2 after INSERT
    on users FOR EACH ROW
    BEGIN
    INSERT INTO user_log(content,create_time) VALUES(CONCAT('添加的用户信息为:',NEW.user_name,' 性别为:',NEW.sex ),NOW());
    end $$
    delimiter ;
    
    INSERT INTO users(user_name,sex) VALUES('xiaohemaio','男');
    
    
    -- 案例二 
    drop TRIGGER if EXISTS TRIGGER_test3;
    
    delimiter $$
    CREATE TRIGGER TRIGGER_test3  BEFORE UPDATE
    on users FOR EACH ROW
    BEGIN
    INSERT INTO user_log(content,create_time) VALUES(CONCAT('将:',OLD.user_name,' 修改为:',NEW.user_name ),NOW());
    end $$
    delimiter ;
    
    update users set user_name='迪丽热巴' WHERE id=4;
    
    -- 案例三
    drop TRIGGER if EXISTS TRIGGER_test4;
    
    delimiter $$
    CREATE TRIGGER TRIGGER_test4  BEFORE DELETE
    on users FOR EACH ROW
    BEGIN
    INSERT INTO user_log(content,create_time) VALUES(CONCAT('将id为:',OLD.user_name,' 已删除' ),NOW());
    end $$
    delimiter ;
    
    DELETE FROM  users WHERE id=4;
    ログイン後にコピー

    MySqlデータベーストリガーの使用方法

    4. その他の操作

    -- 查看触发器
    SHOW TRIGGERS;
    
    -- 删除触发器
    drop TRIGGER if EXISTS 触发器名;
    ログイン後にコピー

    5. 注意事項

    1. 再帰ループを避けるため、トリガー内のこのテーブルに対して挿入、更新、および削除の操作を実行することはできません。トリガー

    2. トリガーの使用はできるだけ少なくしてください。トリガーが毎回 1 秒実行され、テーブル 500 のデータを挿入すると仮定します。その場合、トリガーは 500 回トリガーされる必要があります。トリガーのみの実行時間500 秒かかり、500 個のデータを挿入すると、1 つのデータに合計 1 秒かかるため、この挿入の効率は非常に低くなります。

    3. トリガーはデータの行ごとにあります。大量のリソースを消費するため、頻繁に追加、削除、変更されるテーブルにはトリガーを使用しないでください。

    補足: 検証トリガー

    ユーザー テーブル users にデータを挿入します。

    mysql> INSERT INTO users (userName, password, name, nickName, sex, email, isManager) VALUE ('itbilu', 'e10adc3949ba59abbe56e057f20f883e', 'IT笔录', 'itbilu', 1, 'cn.liuht@gmail.com', 0);
    ログイン後にコピー

    users には元々データがなく、挿入されたばかりのデータの userId は 1 でした。ユーザー テーブル ロール テーブル userRoles にデータを挿入して、トリガーをトリガーします:

    mysql> INSERT INTO userRoles (userId, roleId) VALUE (1, 1);
    ログイン後にコピー

    挿入したばかりのデータがトリガーをトリガーしました。結果は次のとおりです:

    mysql> select isManager from users;
    +-----------+
    | isManager |
    +-----------+
    |         1 |
    +-----------+
    ログイン後にコピー

    以上がMySqlデータベーストリガーの使用方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    関連ラベル:
    ソース:yisu.com
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    最新の問題
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート