MySQL 触发器

前言

  • 触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。

1、创建触发器

  • 1)触发器只能创建在永久表(Permanent Table)上,不能对临时表(Temporary Table)创建触发器。

    # 创建触发器,单条执行语句
    
    # create trigger
        触发器名                // 不能与已存在的触发器重复
        触发时间                // before、after,表示事件之前或之后触发
        触发事件                // insert、update、delete 触发该触发器的具体事件
      on 
        触发器响应表名           // 该触发器操作的表
      for each row
        触发操作;
    
    > create trigger
        trigger_student_count_insert
        after 
        insert
      on
        student
      for each row
        update student_count set scount = scount + 1;
    
        Query OK, 0 rows affected (0.09 sec)
    # 创建触发器,多条执行语句
    
    # delimiter $$             // 定义结束符
      create trigger
        触发器名                // 不能与已存在的触发器重复
        触发时间                // before、after,表示事件之前或之后触发
        触发事件                // insert、update、delete 触发该触发器的具体事件
      on 
        触发器响应表名           // 该触发器操作的表
      for each row
      begin
        触发操作(多条执行语句);   // 每条语句使用分号结束
      end
      $$                       // 使用自定义结束符
    
    > delimiter $$
    > create trigger
        trigger_student_count_insert
        after 
        insert
      on
        student
      for each row
      begin
        update student_count set scount = scount + 1;
        update student_count set scount = scount + 1000;
      end
      $$
    
        Query OK, 0 rows affected (0.10 sec)
  • 2)对同一个表相同触发时间的相同触发事件,只能定义一个触发器。

    • 例如,对某个表的不同字段的 after 更新触发器,在使用 Oracle 数据库的时候,可以定义成两个不同的 update 触发器,更新不同的字段时触发单独的触发器,但是在 MYSQL 数据库中,只能定义成一个触发器,在触发器中通过判断更新的字段进行对应的处理。
  • 3)使用别名 old 和 new 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。

    别名解释
    new在触发器为 insert 事件类型时有效,表示当前正在插入的数据,如 new.class
    old在触发器为 delete 事件类型时有效,表示当前正在删除的数据,如 old.class
    > delimiter $$
      create trigger 
        ins_film
        after 
        insert 
      on 
        film 
      for each row 
      begin
        insert into 
          film_text (film_id, title, description)
          values (new.film_id, new.title, new.description);
      end;
      $$
    • 插入 film 表记录的时候,会向 film_text 表中也插入相应的记录。

2、删除触发器

  • 一次可以删除一个触发程序,如果没有指定 schema_name,默认为当前数据库。

    # 删除触发器
    # drop trigger [schema_name.]触发器名;
    > drop trigger trigger_student_count_insert;
    
        Query OK, 0 rows affected (0.00 sec)
    
    # 删除触发器,如果触发器存在就删除
    # drop trigger if exists 触发器名;
    > drop trigger if exists trigger_student_count_insert;

3、查看触发器

  • 可以通过执行 show triggers 命令查看所有触发器的状态、语法等信息。

    # 查看所有的触发器
    > show triggers;
    
        *************************** 1. row ***************************
                     Trigger: trigger_student_count_insert
                       Event: INSERT
                       Table: student
                   Statement: begin
                                update student_count set scount = scount + 1;
                                update student_count set scount = scount + 1000;
                              end
                      Timing: AFTER
                     Created: 2018-06-28 18:42:15.47
                    sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,
                              NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
                     Definer: root@localhost
        character_set_client: utf8mb4
        collation_connection: utf8mb4_0900_ai_ci
          Database Collation: gbk_chinese_ci
    
        *************************** 2. row ***************************
        ...
    
        ... row in set (0.01 sec)
  • 可以通过查询系统表的 information_schema.triggers 表的方式查询指定触发器的指定信息。

    > use information_schema;
    
        Reading table information for completion of table and column names
        You can turn off this feature to get a quicker startup with -A
    
        Database changed
    
    > desc triggers;
    
        +----------------------------+----------------------------------+------+-----+----------------------+--------------------------------+
        | Field                      | Type                             | Null | Key | Default              | Extra                          |
        +----------------------------+----------------------------------+------+-----+----------------------+--------------------------------+
        | TRIGGER_CATALOG            | varchar(64)                      | NO   |     | NULL                 |                                |
        | TRIGGER_SCHEMA             | varchar(64)                      | NO   |     | NULL                 |                                |
        | TRIGGER_NAME               | varchar(64)                      | NO   |     | NULL                 |                                |
        | EVENT_MANIPULATION         | enum('INSERT','UPDATE','DELETE') | NO   |     | NULL                 |                                |
        | EVENT_OBJECT_CATALOG       | varchar(64)                      | NO   |     | NULL                 |                                |
        | EVENT_OBJECT_SCHEMA        | varchar(64)                      | NO   |     | NULL                 |                                |
        | EVENT_OBJECT_TABLE         | varchar(64)                      | NO   |     | NULL                 |                                |
        | ACTION_ORDER               | int(10) unsigned                 | NO   |     | NULL                 |                                |
        | ACTION_CONDITION           | binary(0)                        | YES  |     | NULL                 |                                |
        | ACTION_STATEMENT           | longtext                         | NO   |     | NULL                 |                                |
        | ACTION_ORIENTATION         | varchar(3)                       | NO   |     |                      |                                |
        | ACTION_TIMING              | enum('BEFORE','AFTER')           | NO   |     | NULL                 |                                |
        | ACTION_REFERENCE_OLD_TABLE | binary(0)                        | YES  |     | NULL                 |                                |
        | ACTION_REFERENCE_NEW_TABLE | binary(0)                        | YES  |     | NULL                 |                                |
        | ACTION_REFERENCE_OLD_ROW   | varchar(3)                       | NO   |     |                      |                                |
        | ACTION_REFERENCE_NEW_ROW   | varchar(3)                       | NO   |     |                      |                                |
        | CREATED                    | timestamp(2)                     | NO   |     | CURRENT_TIMESTAMP(2) | on update CURRENT_TIMESTAMP(2) |
        | SQL_MODE                   | set('REAL_AS_FLOAT',
                                        'PIPES_AS_CONCAT',
                                        'ANSI_QUOTES',
                                        'IGNORE_SPACE',
                                        'NOT_USED',
                                        'ONLY_FULL_GROUP_BY',
                                        'NO_UNSIGNED_SUBTRACTION',
                                        'NO_DIR_IN_CREATE',
                                        'NOT_USED_9',
                                        'NOT_USED_10',
                                        'NOT_USED_11',
                                        'NOT_USED_12',
                                        'NOT_USED_13',
                                        'NOT_USED_14',
                                        'NOT_USED_15',
                                        'NOT_USED_16',
                                        'NOT_USED_17',
                                        'NOT_USED_18',
                                        'ANSI',
                                        'NO_AUTO_VALUE_ON_ZERO',
                                        'NO_BACKSLASH_ESCAPES',
                                        'STRICT_TRANS_TABLES',
                                        'STRICT_ALL_TABLES',
                                        'NO_ZERO_IN_DATE',
                                        'NO_ZERO_DATE',
                                        'INVALID_DATES',
                                        'ERROR_FOR_DIVISION_BY_ZERO',
                                        'TRADITIONAL',
                                        'NOT_USED_29',
                                        'HIGH_NOT_PRECEDENCE',
                                        'NO_ENGINE_SUBSTITUTION',
                                        'PAD_CHAR_TO_FULL_LENGTH')   | NO   |     | NULL                 |                                |
        | DEFINER                    | varchar(93)                      | NO   |     | NULL                 |                                |
        | CHARACTER_SET_CLIENT       | varchar(64)                      | NO   |     | NULL                 |                                |
        | COLLATION_CONNECTION       | varchar(64)                      | NO   |     | NULL                 |                                |
        | DATABASE_COLLATION         | varchar(64)                      | NO   |     | NULL                 |                                |
        +----------------------------+----------------------------------+------+-----+----------------------+--------------------------------+
        22 rows in set (0.00 sec)
    # 查询指定触发器
    > select * from triggers where trigger_name = 'trigger_student_count_insert' \G
    
        *************************** 1. row ***************************
                   TRIGGER_CATALOG: def
                    TRIGGER_SCHEMA: test
                      TRIGGER_NAME: trigger_student_count_insert
                EVENT_MANIPULATION: INSERT
              EVENT_OBJECT_CATALOG: def
               EVENT_OBJECT_SCHEMA: test
                EVENT_OBJECT_TABLE: student
                      ACTION_ORDER: 1
                  ACTION_CONDITION: NULL
                  ACTION_STATEMENT: begin
                                      update student_count set scount = scount + 1;
                                      update student_count set scount = scount + 1000;
                                    end
                ACTION_ORIENTATION: ROW
                     ACTION_TIMING: AFTER
        ACTION_REFERENCE_OLD_TABLE: NULL
        ACTION_REFERENCE_NEW_TABLE: NULL
          ACTION_REFERENCE_OLD_ROW: OLD
          ACTION_REFERENCE_NEW_ROW: NEW
                           CREATED: 2018-06-28 18:42:15.47
                          SQL_MODE: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
                           DEFINER: root@localhost
              CHARACTER_SET_CLIENT: utf8mb4
              COLLATION_CONNECTION: utf8mb4_0900_ai_ci
                DATABASE_COLLATION: gbk_chinese_ci
        1 row in set (0.00 sec)

4、使用触发器

  • 触发器执行的语句有以下两个限制。

    • 触发程序不能调用将数据返回客户端的存储程序,也不能使用采用 call 语句的动态 SQL 语句,但是允许存储程序通过参数将数据返回触发程序。也就是存储过程或者函数通过 out 或者 inout 类型的参数将数据返回触发器是可以的,但是不能调用直接返回数据的过程。
    • 不能在触发器中使用以显式或隐式方式开始或结束事务的语句,如 start trans-action、commit 或 rollback。
  • 触发器触发顺序

    • MySQL 的触发器是按照 before 触发器、行操作、after 触发器的顺序执行的,其中任何一步操作发生错误都不会继续执行剩下的操作。如果是对事务表进行的操作,那么会整个作为一个事务被回滚(Rollback),但是如果是对非事务表进行的操作,那么已经更新的记录将无法回滚,这也是设计触发器的时候需要注意的问题 。

    • 对于有重复记录、需要进行 update 操作的 insert,触发器触发的顺序是 before insert、before update、after update;
    • 对于没有重复记录的 insert,就是简单地执行 insert 操作,触发器触发的顺序是 before insert、after insert。
    • 对于那些实际执行 update 操作的记录,仍然会执行 before insert 触发器的内容,在设计触发器的时候一定要考虑这种情况,避免错误地触发了触发器。

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值