GVKun编程网logo

MySQL触发器(mysql触发器的使用及语法)

20

如果您对MySQL触发器感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于MySQL触发器的详细内容,我们还将为您解答mysql触发器的使用及语法的相关问题,并且为您提供关于1

如果您对MySQL触发器感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于MySQL触发器的详细内容,我们还将为您解答mysql触发器的使用及语法的相关问题,并且为您提供关于13.Mysql触发器、Mysql学习MySQL触发器 Update触发Insert失败、mysql触发器2、mysql触发器之创建使用触发器简单示例的有价值信息。

本文目录一览:

MySQL触发器(mysql触发器的使用及语法)

MySQL触发器(mysql触发器的使用及语法)

触发器(trigger)是数据库中的一个很重要的、很实用的基于事件的处理器,在处理一些业务需求的时候,使用触发器会很方便。似乎在《高性能MysqL》中,对触发器作了一定的描述,也提到使用中的一些优势和局限性,但感觉还是不能完全理解触发器的全部功能和实现。于是自己在网上看了一些文章,结合官网(https://dev.MysqL.com/doc/refman/8.0/en/trigger-Syntax.html)中的案例,写下这篇总结。

基本理解:

1. 使用场合:

触发器是基于事件的,主要的事件也就是MysqL的增删改操作,即insert,delete,update。

2. 触发器的命名

Trigger names exist in the schema namespace,meaning that all triggers must have unique names within a schema. Triggers in different schemas can have the same name.

因为触发器在单表的命名空间内,所以同一个表的触发器名称需要不同。不同表可以有相同的触发器名称。

3. 触发器执行顺序

如果有相同的update(或者delete,insert)触发器,就会按照创建的时间来执行。

而FOLLOWS 和 PRECEDES 可以修改trigger的执行顺序

例如官方的案例:

MysqL> CREATE TRIGGER ins_transaction BEFORE INSERT ON account

       FOR EACH ROW PRECEDES ins_sum

       SET

       @deposits = @deposits + IF(NEW.amount>0,NEW.amount,0),

       @withdrawals = @withdrawals + IF(NEW.amount<0,-NEW.amount,0);

Query OK,0 rows affected (0.01 sec)

ins_transaction和ins_sum分别是两个触发器的名称。

4. 触发器的作用

1. 安全性。可以基于数据库的值使用户具有操作数据库的某种权利。

1)可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据。

2)可以基于数据库中的数据限制用户的操作,例如不允许单个商品的购买量大于一个固定值。

2. 审计。可以跟踪用户对数据库的操作。  

 1)审计用户操作数据库的语句。

 2)把用户对数据库的更新写入审计表。

这一块因为本人没有用过,就不赘述了,以后有机会来补充

3. 实现复杂的数据完整性规则

实现非标准的数据完整性检查和约束。触发器可产生比规则更为复杂的限制。与规则不同,触发器可以引用列或数据库对象。例如,触发器可回退任何企图吃进超过自己保证金的期货。

4. 实现复杂的非标准的数据库相关完整性规则。

1)触发器可以对数据库中相关的表进行连环更新。这是用得比较多的一种实现功能。

2) 触发器能够拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。当插入一个与其主健不匹配的外部键时,这种触发器会起作用。

下面的例子我会比较详细的描述这两个特性。

5. 同步实时地复制表中的数据。

6. 自动计算数据值,如果数据的值达到了一定的要求,则进行特定的处理。

例如,如果公司的帐号上的资金低于5万元则立即给财务人员发送警告数据。

1)插入数据:

当用户添加一个订单的时候,我们需要对商品表格中的库存(storage)进行相应的改动

MysqL>->-> -> update goods set storage=storage-new.amount where id=->0.03MysqL>insert into shoppingcar values(1,1,2);

查询结果:

+-------+---------+-------------+---------+ | id | gname | description | storage | +-------+---------+---------- --+---------+ | 1 | huawei | rongyao9 | 198 | | 2 | iphone | iphoneX | 100 | +-------+---------+-------------+---------+shoppingcar表
+----- -+----- -+--------+
| u_id | g_id | amount |
+-------+-------+--------+
| 1 | 1 | 2 |
+-------+-------+--------+

关于newold的使用

new表示新的数据行,而old表示旧的数据行

2)删除数据

例如,用户撤销一个订单的时候,我们需要将商品的数量加回去

MysqL>->-> -> update goods set storage=storage+old.amount where id=0.01 sec)

<div>

删除前:
MysqL> select  * +-----+---------+-------------+---------+
| id  | gname   | description | storage |
+-----+---------+-------------+---------+
|  1  |  huawei | rongyao9    |    198  |
|  2  |  iphone | iphoneX     |    100  |
+-----+---------+-------------+---------+
2 rows  set (0.00MysqL> select  * <span>from<span> shoppingcar;
+------+------+--------+
| u_id | g_id | amount |
+------+------+--------+
| 1 | 1 | 2 |
+------+------+--------+
1 rows <span>in set (0.00 sec)

13.Mysql触发器

13.Mysql触发器

13.触发器
13.1 创建触发器
定义:触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。
语法:
create trigger 触发器名称 触发时机 触发事件 on 表名 for each row
begin
触发动作;
end$$
说明:
触发时机分为before和after,表示触发器在DML语句之前还是之后触发。
触发事件分为insert、update、delete,表示触发器被特定类型的DML语句(insert、update、delete)触发。
触发动作是触发器所要执行的语句集合。
伪记录OLD和NEW,用来表示变前行和变后行,只能在行级触发器内使用。
触发事件函数inserting、updating、deleting,用来区分不同的触发事件以执行不同的触发动作。
注意:
mysql目前只支持行级触发器,暂不支持语句级触发器。
mysql目前对同一个表相同的触发时机和触发事件下只能定义一个触发器。
mysql目前不支持触发事件函数(inserting、updating、deleting),所以不同的触发事件需要单独建立触发器。
对于插入或更新语句(insert into ... on duplicate key update ...),在新增重复数据时会触发before insert、before update、after update类型相关的触发器。
例子:

13.2 删除触发器
语法:
drop trigger schema.trigger_name;
说明:
一次可以删除一个触发器;
schema未指定时默认为当前数据库。

13.3 查看触发器
查看全部触发器:
show triggers;
查看特定触发器:
select * from information_schema.triggers where trigger_name=''***'';

13.4 触发器的使用
触发动作限制:
触发程序不能调用将数据返回给客户端的存储程序(触发器里不能调用函数),
也不能使用采用call语句的动态sql语句(不能使用动态sql),
不能在触发器中使用以显式或隐式方式开始或结束事务的语句,如Start transaction、commit、rollback等(不能进行事务处理)。
触发器允许存储程序通过参数将数据返回触发程序(可以调用存储过程)。
触发顺序:before触发器--》DML语句--》after触发器。
触发器对事务表进行操作时,整个操作作为一个事务,如果发生异常,操作将被全部回滚;
触发器对非事务表进行操作时,整个操作不会作为一个事务,如果发生异常,操作将被中断,已更新的记录不进行回滚。

13.5 小结
不要将应用的处理逻辑过多的依赖于触发器来处理。

Mysql学习MySQL触发器 Update触发Insert失败

Mysql学习MySQL触发器 Update触发Insert失败

《MysqL学习MysqL触发器 Update触发Insert失败》要点:
本文介绍了MysqL学习MysqL触发器 Update触发Insert失败,希望对您有用。如果有疑问,可以联系我们。

今天工作需要,想要实现将仅对状态更新的表进行历史记录显示,于是考虑在原表中建立触发器,将更新的内容同时写入另一张表
MysqL实例

于是进行测试
MysqL实例

--建立测试表CREATE TABLE `triggletest_triggle` (
`id` INT(11) NOT NULL,`name` VARCHAR(5) NULL DEFAULT NULL,PRIMARY KEY (`id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB 
--建立目标表
CREATE TABLE `triggletest` (
`seq` INT(11) NOT NULL,`id` INT(11) NOT NULL,PRIMARY KEY (`seq`),INDEX `id` (`id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB; 
---写入测试数据
INSERT INTO `triggletest_triggle` VALUES(1,'A'); 
--建立触发器
DROP TRIGGER if EXISTS test1
CREATE TRIGGER test1 
AFTER UPDATE ON triggletest_triggle
FOR EACH ROW
BEGIN
INSERT INTO triggletest(id) values (new.id);
END 

执行触发器语句,报错,报错内容如下:
MysqL实例

/* sql错误(1064):You have an error in your sql Syntax; check the manual that corresponds to your MysqL server version for the right Syntax to use near 'CREATE TRIGGER test1 
AFTER UPDATE ON triggletest_triggle
FOR EACH ROW
BEGIN ' at line 2 */
---最终实现代码
DROP TRIGGER if EXISTS test1;
CREATE TRIGGER test1 AFTER UPDATE ON test.triggletest_triggle FOR EACH ROW
BEGIN
INSERT INTO triggletest(id,name) values (new.id,new.name);
END; 

分析,由于拜访工具Hedisql,导致无法正常创建触发器,相同语句,在Hedisql中执行,使用shell调用MysqL,直接执行程序,成功.
MysqL实例

小编PHP培训学院每天发布《MysqL学习MysqL触发器 Update触发Insert失败》等实战技能,PHP、MysqL、LINUX、APP、JS,CSS全面培养人才。

mysql触发器2

mysql触发器2

更新

mysql> create trigger t2
-> after
-> insert on ord
-> for each row
-> begin update goods set num=num-new.mch where gid = new.gid;
-> end$
Query OK, 0 rows affected (0.02 sec)

 

mysql> 查看已有触发器trigger
-> ^C
mysql> show tigger;

 

删除:

mysql> create trigger t3 after delete on ord
-> for each row begin update goods set num = num -old.mch where
-> gid = old.gid;end $
Query OK, 0 rows affected (0.02 sec)

mysql> show triggers;
-> $
+---------+--------+-------+-------------------------------------------------------------------+--------+------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
| Trigger | Event | Table | Statement | Timing | Created | sql_mode | Definer | character_set_client | collation_connection | Database Collation |
+---------+--------+-------+-------------------------------------------------------------------+--------+------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
| t2 | INSERT | ord | begin update goods set num=num-new.mch where gid = new.gid;
end | AFTER | 2019-06-03 07:47:00.22 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | root@localhost | utf8 | utf8_general_ci | utf8_general_ci |
| t3 | DELETE | ord | begin update goods set num = num -old.mch where
gid = old.gid;end | AFTER | 2019-06-03 07:57:21.92 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | root@localhost | utf8 | utf8_general_ci | utf8_general_ci |
+---------+--------+-------+-------------------------------------------------------------------+--------+------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
2 rows in set (0.00 sec)

mysql触发器之创建使用触发器简单示例

mysql触发器之创建使用触发器简单示例

本文实例讲述了mysql触发器之创建使用触发器。分享给大家供大家参考,具体如下:

我们可以可以使用CREATE TRIGGER语句创建一个新的触发器,来看下具体的语法:

CREATE TRIGGER trigger_name trigger_time trigger_event
 ON table_name
 FOR EACH ROW
 BEGIN
 ...
 END;

然后我们来详细看下上述sql的具体含义:

大概了解了之后,我们就来尝试创建触发器来记录employees表中行数据的更改情况,先来看下这个表的结构:

mysql> DESC employees;
+----------------+--------------+------+-----+---------+-------+
| Field     | Type     | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+-------+
| employeeNumber | int(11)   | NO  | PRI | NULL  |    |
| lastName    | varchar(50) | NO  |   | NULL  |    |
| firstName   | varchar(50) | NO  |   | NULL  |    |
| extension   | varchar(10) | NO  |   | NULL  |    |
| email     | varchar(100) | NO  |   | NULL  |    |
| officeCode   | varchar(10) | NO  | MUL | NULL  |    |
| reportsTo   | int(11)   | YES | MUL | NULL  |    |
| jobTitle    | varchar(50) | NO  |   | NULL  |    |
+----------------+--------------+------+-----+---------+-------+
8 rows in set

我们再来创建一个名为employees audit的新表,用来保存employees表中数据的更改:

CREATE TABLE employees_audit (
  id INT AUTO_INCREMENT PRIMARY KEY,
  employeeNumber INT NOT NULL,
  lastname VARCHAR(50) NOT NULL,
  changedat DATETIME DEFAULT NULL,
  action VARCHAR(50) DEFAULT NULL
);

再来创建一个BEFORE UPDATE触发器,该触发器在对employees表中的行记录更改之前被调用:

DELIMITER $$
CREATE TRIGGER before_employee_update 
  BEFORE UPDATE ON employees
  FOR EACH ROW 
BEGIN
  INSERT INTO employees_audit
  SET action = ''update'',
   employeeNumber = OLD.employeeNumber,
    lastname = OLD.lastname,
    changedat = NOW(); 
END$$
DELIMITER ;

在上述触发器的主体中,我们使用OLD关键字来访问受触发器影响的行的employeeNumber和lastname列。我们要注意的是,在为insert定义的触发器中,可以仅使用NEW关键字。不能使用OLD关键字。但是,在为DELETE定义的触发器中,没有新行,因此您只能使用OLD关键字。在update触发器中,OLD是指更新前的行,而NEW是更新后的行。

然后,我们可以使用SHOW TRIGGERS语句,来查看数据库中的触发器:

mysql> SHOW TRIGGERS;
+------------------------+--------+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
| Trigger        | Event | Table   | Statement                                                                               | Timing | Created        | sql_mode                                     | Definer    | character_set_client | collation_connection | Database Collation |
+------------------------+--------+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
| before_employee_update | UPDATE | employees | BEGIN
  INSERT INTO employees_audit
  SET action = ''update'',
   employeeNumber = OLD.employeeNumber,
    lastname = OLD.lastname,
    changedat = NOW();
END | BEFORE | 2017-08-02 22:06:36.40 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | root@localhost | utf8         | utf8_general_ci   | utf8_general_ci  |
+------------------------+--------+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-----------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
1 row in set

完事我们就来更新employees表以检查触发器是否被调用:

UPDATE employees 
SET 
  lastName = ''Maxsu''
WHERE
  employeeNumber = 1056;

可以使用以下查询来查询employees_audit表,用以检查触发器是否被UPDATE语句调用:

mysql> SELECT * FROM employees_audit;
+----+----------------+----------+---------------------+--------+
| id | employeeNumber | lastname | changedat      | action |
+----+----------------+----------+---------------------+--------+
| 1 |      1056 | Hill   | 2017-08-02 22:15:51 | update |
+----+----------------+----------+---------------------+--------+
1 row in set

如上面输出结果所示,触发器被真正调用,并在employees_audit表中插入一个新行。

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

更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》、《MySQL数据库锁相关技巧汇总》及《MySQL常用函数大汇总》

希望本文所述对大家MySQL数据库计有所帮助。

您可能感兴趣的文章:

我们今天的关于MySQL触发器mysql触发器的使用及语法的分享已经告一段落,感谢您的关注,如果您想了解更多关于13.Mysql触发器、Mysql学习MySQL触发器 Update触发Insert失败、mysql触发器2、mysql触发器之创建使用触发器简单示例的相关信息,请在本站查询。

本文标签:

上一篇MySql 中文写入数据库乱码及Incorrect string value: 'xF0x9F...' for column 'XXX' at row 1解决

下一篇MySQL聚簇索引(mysql聚簇索引和非聚簇索引区别)