精华内容
下载资源
问答
  • 在mysql 5.7.2+版本之前,我们只能为表中的事件创建一个触发器,例如,只能为BEFORE UPDATE或AFTER UPDATE事件创建一个触发器。 mysql 5.7.2+版本解决了这样限制,并允许我们为表中的相同事件和动作时间创建多个...
  • mysql触发器创建个触发器

    千次阅读 2018-07-13 13:30:41
    在mysql 5.7.2+版本之前,我们只能为表中的事件创建一个触发器,例如,只能为BEFORE UPDATE或AFTER UPDATE事件创建一个触发器。 mysql 5.7.2+版本解决了这样限制,并允许我们为表中的相同事件和动作时间创建多个...

    这次记录的内容mysql 版本必须得是5.7.2+的哈,之前的会不好使的。废话不多说,咱们开始正文哈。

    mysql 5.7.2+版本之前,我们只能为表中的事件创建一个触发器,例如,只能为BEFORE UPDATEAFTER UPDATE事件创建一个触发器。 mysql 5.7.2+版本解决了这样限制,并允许我们为表中的相同事件和动作时间创建多个触发器。当事件发生时,触发器将依次激活。我们来参考创建第一个触发器中的语法。如果表中有相同事件有多个触发器,mysql 将按照创建的顺序调用触发器。要更改触发器的顺序,需要在FOR EACH ROW子句之后指定FOLLOWSPRECEDES。我们来看下这两个词的说明:

    • FOLLOWS选项允许新触发器在现有触发器之后激活。
    • PRECEDES选项允许新触发器在现有触发器之前激活。

    完事来看下使用显式顺序创建新的附加触发器的语法:

    DELIMITER $$
    CREATE TRIGGER  trigger_name
    [BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON table_name
    FOR EACH ROW [FOLLOWS|PRECEDES] existing_trigger_name
    BEGINEND$$
    DELIMITER ;
    

    然后,我们来看一个在表中的同一个事件和动作上,创建多个触发器的例子。我们来基于products表进行演示,首先来创建一个新的price_logs表,完事呢,每当更改产品的价格(MSRP列)时,要将旧的价格记录在一个名为price_logs的表中,先来看想sql:

    CREATE TABLE price_logs (
      id INT(11) NOT NULL AUTO_INCREMENT,
      product_code VARCHAR(15) NOT NULL,
      price DOUBLE NOT NULL,
      updated_at TIMESTAMP NOT NULL DEFAULT 
                 CURRENT_TIMESTAMP 
                 ON UPDATE CURRENT_TIMESTAMP,
    
      PRIMARY KEY (id),
    
      KEY product_code (product_code),
    
      CONSTRAINT price_logs_ibfk_1 FOREIGN KEY (product_code) 
      REFERENCES products (productCode) 
      ON DELETE CASCADE 
      ON UPDATE CASCADE
    );

    完事,当表的BEFORE UPDATE事件发生时,创建一个新的触发器。触发器名称为before_products_update,具体实现如下所示:

    DELIMITER $$
    
    CREATE TRIGGER before_products_update 
       BEFORE UPDATE ON products 
       FOR EACH ROW 
    BEGIN
         INSERT INTO price_logs(product_code,price)
         VALUES(old.productCode,old.msrp);
    END$$
    
    DELIMITER ;
    

    然后,当我们更改产品的价格,并使用以下update语句,最后查询price_logs表:

    UPDATE products
    SET msrp = 95.1
    WHERE productCode = 'S10_1678';
    -- 查询结果价格记录
    SELECT * FROM price_logs;
    

    上面查询语句执行后,得到以下结果:

    +----+--------------+-------+---------------------+
    | id | product_code | price | updated_at          |
    +----+--------------+-------+---------------------+
    |  1 | S10_1678     |  95.7 | 2017-08-03 02:46:42 |
    +----+--------------+-------+---------------------+
    1 row in set
    

    可以看到结果中,它按我们预期那样工作了。

    完事我们再来假设不仅要看到旧的价格,改变的时候,还要记录是谁修改了它。要实现这个,我们可以向price_logs表添加其他列,但是,为了实现多个触发器的演示,我们将创建一个新表来存储进行更改的用户的数据。这个新表的名称为user_change_logs,结构如下:

    CREATE TABLE user_change_logs (
      id int(11) NOT NULL AUTO_INCREMENT,
      product_code varchar(15) DEFAULT NULL,
      updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
      ON UPDATE CURRENT_TIMESTAMP,
    
      updated_by varchar(30) NOT NULL,
    
      PRIMARY KEY (id),
    
      KEY product_code (product_code),
    
      CONSTRAINT user_change_logs_ibfk_1 FOREIGN KEY (product_code) 
      REFERENCES products (productCode) 
      ON DELETE CASCADE ON UPDATE CASCADE
    );

    现在,我们创建一个在products表上的BEFORE UPDATE事件上激活的第二个触发器。 此触发器将更改的用户信息更新到user_change_logs表。 它在before_products_update触发后被激活:

    DELIMITER $$
    CREATE TRIGGER before_products_update_2 
       BEFORE UPDATE ON products 
       FOR EACH ROW FOLLOWS before_products_update
    BEGIN
       INSERT INTO user_change_logs(product_code,updated_by)
       VALUES(old.productCode,user());
    END$$
    
    DELIMITER ;
    

    然后我们来使用update语句更新指定产品的价格:

    UPDATE products
    SET msrp = 95.3
    WHERE productCode = 'S10_1678';
    

    再来分别从price_logsuser_change_logs表查询数据:

    mysql> SELECT * FROM price_logs;
    +----+--------------+-------+---------------------+
    | id | product_code | price | updated_at          |
    +----+--------------+-------+---------------------+
    |  1 | S10_1678     |  95.7 | 2017-08-03 02:46:42 |
    |  2 | S10_1678     |  95.1 | 2017-08-03 02:47:21 |
    +----+--------------+-------+---------------------+
    2 rows in set
    mysql> SELECT * FROM user_change_logs;
    +----+--------------+---------------------+----------------+
    | id | product_code | updated_at          | updated_by     |
    +----+--------------+---------------------+----------------+
    |  1 | S10_1678     | 2017-08-03 02:47:21 | root@localhost |
    +----+--------------+---------------------+----------------+
    1 row in set

    如上所见,两个触发器按照预期的顺序激活执行相关操作了。完事我们来在information_schema数据库的triggers表中的action_order列,看下触发激活同一事件和操作的顺序:

    mysql> SELECT 
        trigger_name, action_order
    FROM
        information_schema.triggers
    WHERE
        trigger_schema = 'yiibaidb'
    ORDER BY event_object_table , 
             action_timing , 
             event_manipulation;
    +--------------------------+--------------+
    | trigger_name             | action_order |
    +--------------------------+--------------+
    | before_employee_update   |            1 |
    | before_products_update   |            1 |
    | before_products_update_2 |            2 |
    +--------------------------+--------------+
    3 rows in set
    

    好啦,本次记录就到这里了。

    如果感觉不错的话,请多多点赞支持哦。。。

    展开全文
  • 我们先做测试:接上篇日志建的商品表g和订单表o和触发器假设:假设商品表有商品1,数量是10;我们往订单表插入条记录:insert into o(gid,much) values(1,20);会发现商品1的数量变为-10了。这就是问题的所在,...

    我们先做个测试:

    接上篇日志建的商品表g和订单表o和触发器

    假设:假设商品表有商品1,数量是10;

    我们往订单表插入一条记录:

    insert into o(gid,much) values(1,20);

    会发现商品1的数量变为-10了。这就是问题的所在,因为我们之前创建的触发器是after,也就是说触发的语句是在插入订单记录之后才执行的,这样我们就无法判断新插入订单的购买数量。

    先讲一下after和before的区别:

    after是先完成数据的增删改,再触发,触发的语句晚于监视的增删改操作,无法影响前面的增删改动作;也就是说先插入订单记录,再更新商品的数量;

    before是先完成触发,再增删改,触发的语句先于监视的增删改,我们就有机会判断,修改即将发生的操作;

    我们用一个典型案例来区分它们的区别,新建一个触发器:

    #监视地点: 商品表o

    #监视事件:insert

    #触发时间:before

    #触发事件:update

    案例:当新增一条订单记录时,判断订单的商品数量,如果数量大于10,就默认改为10

    create trigger tg6

    before insert on o

    for each row

    begin

    if new.much > 10 then

    set new.much = 10;

    end if;

    update g set num = num - new.much where id = new.gid;

    end$

    执行完,把之前创建的after触发器删掉,再来插入一条订单记录:

    insert into o(gid,much) valus(1,20)$

    执行完会发现订单记录的数量变为10,商品1的数量变为0了,就不会出现负数了。

    展开全文
  • trigger AccountAddressTrigger on Account (before insert, before update) { for(Account a : Trigger.new){ If (a.Match_Billing_Address__c == true && a.BillingPostalCode!=Null) { a....

    trigger AccountAddressTrigger on Account (before insert, before update) {
        for(Account a : Trigger.new){
            If (a.Match_Billing_Address__c == true && a.BillingPostalCode!=Null) {
                a.ShippingPostalCode = a.BillingPostalCode;
            }   
        }
    }

     

    展开全文
  • In table A I have fields CENA(price), cena_za_kus(price_per_piece), mnozstvi(quantity).In table B I have field DPH(vat).I'd like to add a before update/insert trigger, which would calculate the value ...

    bd96500e110b49cbb3cd949968f18be7.png

    In table A I have fields CENA(price), cena_za_kus(price_per_piece), mnozstvi(quantity).

    In table B I have field DPH(vat).

    I'd like to add a before update/insert trigger, which would calculate the value of PRICE field, something like this:

    price = (price_per_piece * count) + (price_per_piece * count * tableB.vat)

    Is this possible?

    Thank you.

    Edit: And the row in table A has a foreign_key dph_id pointing to the corresponding row in table B.

    CREATE TABLE `polozky` (

    `id` int(11) NOT NULL AUTO_INCREMENT,

    `objednavka_id` int(11) NOT NULL,

    `dph_id` int(11) NOT NULL,

    `polozka` varchar(64) COLLATE utf8_unicode_ci NOT NULL,

    `cena` float NOT NULL,

    `mnozstvi` int(11) NOT NULL,

    `cena_za_kus` float NOT NULL,

    PRIMARY KEY (`id`),

    KEY `IdObjednavka` (`objednavka_id`,`dph_id`),

    KEY `objednavka_id` (`objednavka_id`),

    KEY `dph_id` (`dph_id`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=63663 ;

    ALTER TABLE `polozky`

    ADD CONSTRAINT `polozky_ibfk_7` FOREIGN KEY (`objednavka_id`) REFERENCES `objednavky` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,

    ADD CONSTRAINT `polozky_ibfk_8` FOREIGN KEY (`dph_id`) REFERENCES `dph` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

    and

    CREATE TABLE `dph` (

    `id` int(11) NOT NULL AUTO_INCREMENT,

    `sekce` varchar(64) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'nastaveni',

    `popis` varchar(8) COLLATE utf8_unicode_ci NOT NULL,

    `DPH` int(11) unsigned NOT NULL,

    `poradi` int(11) unsigned NOT NULL,

    PRIMARY KEY (`id`),

    UNIQUE KEY `DPH_2` (`DPH`),

    UNIQUE KEY `popis` (`popis`),

    KEY `DPH` (`DPH`)

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=9 ;

    解决方案

    Try this:

    DELIMITER $$

    CREATE TRIGGER `yourDB_polozky`

    BEFORE INSERT

    ON `yourDB`.`polozky`

    FOR EACH ROW

    BEGIN

    DECLARE vat_rate float;

    SELECT DPH

    INTO dph_rate

    FROM `yourDB`.`dph`

    WHERE id = new.dph_id;

    SET new.cena = (1 + dph_rate) * (new.cena_za_kus * new.mnozstvi);

    END

    $$

    展开全文
  • 1.说明 熟悉OGG的都知道,OGG是通过ggs_ddl_trigger_before触发器来捕获DDL操作并同步到目标库中,在一次部署RAC环境...通过实验证明触发器的名称并不影响DDL的同步,也就是我们可以创建一个ggs_ddl_trigger_before...
  • oracle创建与常见问题Oracle DBA Studio 工具里面就能创建触发器CREATE TRIGGER名称CREATE TRIGGER — 创建一个触发器语法CREATE TRIGGER name { BEFORE | AFTER } { event [OR ...] }ON table FOR E...
  • oracle创建触发器

    2016-03-03 17:22:15
    工作需要,需要创建一个触发器,判断表中的id是否为空,如果为空的时候需要用触发器加上Id,如果没有触发触发器加上id,如果有则不触发触发器创建一个序列,每次加一个 CREATE SEQUENCE 序列名称 INCREMENT BY ...
  • 一个简单的触发器示例

    千次阅读 2016-04-09 20:06:04
    -- 创建备份表 create table emp_his as (select ...创建触发器内容 -- 创建触发器 create or replace trigger tr_emp_del -- 对scott.emp表在delete操作之前 before delete on scott.emp -- 对每行进行触发动作
  • 创建触发器链接 创建触发器SQL语法: CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name [of <指定列>] ON table_name BEGIN -- 触发器逻辑.... END; event_name : delete, uptate, insert ...
  • ,最后发现是触发器里面刚接触Oracle,,新建了一个before delete的触发器,但老是报“警告: 创建触发器带有编译错误”,最后发现是触发器里面的语句没有写分号的原因。下面帖出来,也供新手参考:1.创建表:...
  • 代码如下: create or replace trigger sortperson before insert on sortperson for each row declare -- local variables here temp integer; begin select max(id) into temp from sortpe...
  • 一个简单MySQL触发器例子

    千次阅读 2013-06-27 15:00:43
    有这样一个需求,更新某张表的某个字段时,要先判断,如果新值比表中老值小,则将老值和新值相加,然后更新;否则正常更新。考虑用MySQL的触发器实现,更新时触发。 下面是具体的sql, 一看便知。 -- 删除...
  • pg数据库创建触发器

    2020-06-09 10:58:05
    触发器是一种由事件自动触发执行的特殊存储过程,这些事件可以是对一个表进行 INSERT、UPDATE、DELETE 等操作。 触发器经常用于加强数据的完整性约束和业务规则上的约束等。 2、创建触发器 步骤: 先为触发器建...
  • Oracle DBA Studio 工具里面就能创建触发器 CREATE TRIGGER 名称 CREATE TRIGGER 创建一个触发器 语法 CREATE TRIGGER name { BEFORE | AFTER } { event [OR .] } ON table FOR EACH { ROW | STATEMENT } EXECUTE ...
  • 5.11 同一事件激活两个触发器问题现在需要创建一个触发器,把SYSDATE的值插入LOCATIONS表的HIRE_DATE字段。但是这个表已经有一个BEFORE INSERT触发器,而你又不希望这两个触发器产生冲突。
  • 触发器是在插入,更新或删除数据时更新同一张表或另一张表的好方法。但是,它们很难正确实现,因为您必须小心确保触发器能够实现预期的效果,并且不会产生意外的副作用。...BEFORE是比较UPDATE或D...
  • create or replace trigger T_sys_config_ddl_refuse_trig before ddl on schema declare v_ipaddress varchar2(20); begin select sys_context('userenv','ip_address') into v_ipaddress from dual...
  • 触发器是在插入,更新或删除数据时更新同一张表或另一张表的好方法。但是,它们很难正确实现,因为您必须小心确保触发器能够实现预期的效果,并且不会产生意外的副作用。...BEFORE是比较UPDATE或D...
  • oracle 创建触发器详解

    千次阅读 2011-11-04 15:06:54
    Oracle DBA Studio 工具里面就能创建触发器 CREATE TRIGGER  名称  CREATE TRIGGER — 创建一个触发器    语法  CREATE TRIGGER name { BEFORE | AFTER } { event [OR ...
  • mysql创建触发器时报1064错误

    千次阅读 2019-12-15 23:12:26
    1.这里有两张表,book和enterbook,book表中的bookid是enterbook的外键,这里想创建一个insert触发器,实现向enterbook表中添加一条数据时,同时也会向book中添加一条数据。 book: enterbook: 2.通常百度的mysql...
  • mysql触发器创建简单触发器及限制

    千次阅读 2018-07-13 10:40:32
    在MySQL中,触发器组SQL语句,当对相关联的表上的数据进行更改时,会自动调用该语句。 触发器可以被定义为在insert,update或delete语句更改数据之前或之后调用。在MySQL5.7.2版本之前,每表最多可以定义六...
  • //做一个简单的练习,创建一个简单的触发器 完成添加文章的时候,自动加上时间,默认作者 为 ‘日记本的回忆‘show columns from test; //查看表结构//查看已存在触发器show triggers \G//将结束符换成$\d $//创建...
  • 一个预定义的事件发生时,会被MySQL自动调用。 创建触发器的语法为 create trigger 自定义触发器名称 (after或者before,表示在触发之后还是之前执行要执行的语句)(触发事件如insert ,update,delete)on 表名...
  • 触发器

    2017-04-17 11:19:52
    例如,学生表中没增加一个学生,学生总数就必须同时发生改变,这里可以创建一个触发器,每增加一个学生就执行一个计算学生总数的操作。、创建一个只有一个执行语句的触发器:  CREATE TRIGGER 触发器BEFORE | ...
  • 一、什么是DML触发器?DML触发器是执行SQL DML语句(INSERT,...•它们执行的次数:一次对于整个DML语句(一个语句触发器),或者对于受DML语句影响的每一行一次(一行触发)。二、创建DML语句触发器CREATE [OR ...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 349
精华内容 139
关键字:

创建一个before触发器