>  기사  >  데이터 베이스  >  MySql 데이터베이스 트리거를 사용하는 방법

MySql 데이터베이스 트리거를 사용하는 방법

WBOY
WBOY앞으로
2023-05-27 10:02:072673검색

    1. 소개

    1. 트리거는 특수 저장 프로시저입니다. 트리거는 저장 프로시저와 마찬가지로 특정 기능을 완료할 수 있는 SQL 조각으로 데이터베이스 서버에 저장되지만 데이터베이스 테이블의 데이터에 대해 DML 작업이 수행되면 실행됩니다. 이 SQL 조각은 수동 전송 없이 자동으로 트리거됩니다.

    2. MySql에서는 삽입, 삭제 및 업데이트 작업이 실행될 때만 트리거가 실행될 수 있습니다.

    3. 이 트리거 기능은 애플리케이션이 데이터베이스에서 데이터 무결성, 로깅 및 데이터 유효성 검사를 보장하는 데 도움이 될 수 있습니다. 검증 및 기타 작업

    4. 트리거에서 변경된 레코드 내용을 참조하려면 별칭을 사용하세요. 이는 이제 다른 데이터베이스와 유사하며 명령문 수준 트리거는 지원하지 않습니다.

    2. 테이블 데이터 준비

    # 用户表
    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;

    3. Operation

    # 创建只有一个执行语句的触发器
    
    create trigger 触发器名 before|after 触发事件
    on 表名 for each row
    执行语句;
    
    # 创建有多个执行语句的触发器
    
    create trigger 触发器名 before|after 触发事件
    on 表名 for each row
    begin  
       执行语句列表
    end;

    3. 트리거 사용 NEW 및 OLD

    NEW 및 OLD는 트리거를 나타냅니다. 트리거를 트리거한 테이블의 데이터 수는 트리거에서 변경된 레코드 내용을 나타냅니다.

    Usage: NEW.columnName (columnName은 해당 데이터 테이블의 열 이름)

    MySql 데이터베이스 트리거를 사용하는 방법1. Case

    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;

    4.Notes

    MySql 데이터베이스 트리거를 사용하는 방법1. 재귀 루프가 발생하는 것을 방지하기 위해 이 테이블에서는 삽입, 업데이트 또는 삭제 작업을 수행할 수 없습니다.

    2. 트리거가 매번 1초 동안 실행되고 테이블에 500개의 데이터가 삽입된다고 가정하면, 그러면 트리거를 500번 트리거해야 하며 트리거 실행 시간은 500초가 걸리고 500개의 데이터를 삽입하는 데 총 1초가 걸리므로 이 삽입의 효율성은 매우 낮습니다.

    3. 트리거는 데이터의 각 행마다 사용됩니다. 자주 추가, 삭제, 수정되는 테이블에는 많은 리소스를 소모하므로 트리거를 사용하지 마세요.

    추가됨: 유효성 검사 트리거

    사용자 테이블 사용자에 데이터를 삽입합니다.

    -- 案例一
    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;

    users는 원래 데이터가 없었고, 방금 삽입한 데이터의 userId는 1이었습니다. 트리거를 트리거하려면 사용자 테이블 역할 테이블 userRoles에 데이터를 삽입하세요.

    -- 查看触发器
    SHOW TRIGGERS;
    
    -- 删除触发器
    drop TRIGGER if EXISTS 触发器名;

    방금 삽입한 데이터가 트리거를 트리거했습니다. 결과는 다음과 같습니다.

    mysql> INSERT INTO users (userName, password, name, nickName, sex, email, isManager) VALUE ('itbilu', 'e10adc3949ba59abbe56e057f20f883e', 'IT笔录', 'itbilu', 1, 'cn.liuht@gmail.com', 0);

    위 내용은 MySql 데이터베이스 트리거를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제