原文链接:http://blog.csdn.net/a19881029/article/details/37820363

-----------------------------------------------------------

Oracle触发器格式:

[plain] view plain copy
  1. CREATE [OR REPLACE] TRIGGER trigger_name
  2. BEFORE|AFTER INSERT|UPDATE|DELETE ON table_name
  3. [FOR EACH ROW]
  4. DECLARE arg_name type [CONSTANT] [NOT NULL] [:=value]
  5. BEGIN
  6. pl/sql语句
  7. END

MySQL触发器格式:

[plain] view plain copy
  1. CREATE TRIGGER trigger_name
  2. BEFORE|AFTER INSERT|UPDATE|DELETE ON table_name
  3. [FOR EACH ROW]
  4. BEGIN
  5. DECLARE arg_name1[,arg_name2,...] type [DEFAULT value]
  6. sql语句
  7. END

创建测试表(建表语句适用于Oracle、MySQL):

[sql] view plain copy
  1. CREATE TABLE test(
  2. id            int,
  3. name          varchar(10),
  4. age           int,
  5. birthday      date,
  6. description   varchar(50),
  7. PRIMARY KEY (id)
  8. );
  9. CREATE TABLE test_log(
  10. id            int,
  11. dealtime      date,
  12. dealtype      varchar(10),
  13. PRIMARY KEY (`id`)
  14. );

Oracle触发器和MySQL触发器的区别如下:

1,创建语句格式不同

Oracle:create or replace(Oracle客户端需要手动提交,MySQL客户端设置的自动提交)

[plain] view plain copy
  1. SQL> CREATE OR REPLACE TRIGGER trigger_test_insert
  2. 2         BEFORE INSERT ON test
  3. 3         FOR EACH ROW
  4. 4  BEGIN
  5. 5         insert into test_log values(1,sysdate,'insert');
  6. 6  END;
  7. 7  /
  8. Trigger created
  9. SQL> insert into test(id, name) values(1, 'name');
  10. 1 row inserted
  11. SQL> commit;
  12. Commit complete
  13. SQL> select * from test_log;
  14. ID DEALTIME    DEALTYPE
  15. --------------------------------------- ----------- ----------
  16. 1 2014/7/16 1 insert

MySQL:不包含or replace

[plain] view plain copy
  1. mysql> delimiter $
  2. CREATE TRIGGER trigger_test_insert
  3. BEFORE INSERT ON test
  4. FOR EACH ROW
  5. BEGIN
  6. insert into test_log values(1,now(),'insert');
  7. END$
  8. delimiter ;
  9. Query OK, 0 rows affected
  10. mysql> insert into test(id, name) values(1, 'name');
  11. Query OK, 1 row affected
  12. mysql> select * from test_log;
  13. +----+------------+----------+
  14. | id | dealtime   | dealtype |
  15. +----+------------+----------+
  16. |  1 | 2014-07-16 | insert   |
  17. +----+------------+----------+
  18. 1 row in set

2,变量的声明位置、声明格式均不相同

Oracle:声明位置在触发时的执行语句块外部

通过%type的方式将变量与表特定字段类型相关联的好处是:在某些情况下,修改该字段类型时不需要修改触发器(如:字段类型由varchar(10)修改为varchar(20)时,不需要修改触发器)

[plain] view plain copy
  1. SQL> CREATE TRIGGER trigger_test_insert
  2. 2         BEFORE INSERT ON test
  3. 3         FOR EACH ROW
  4. 4  DECLARE id1 int default 1;
  5. 5          id2 int:=1;
  6. 6          id3 test_log.id%type:=1;
  7. 7  BEGIN
  8. 8          insert into test_log values(id1+id2+id3,sysdate,'insert');
  9. 9  END;
  10. 10  /
  11. Trigger created
  12. SQL> insert into test(id, name) values(1, 'name');
  13. 1 row inserted
  14. SQL> commit;
  15. Commit complete
  16. SQL> select * from test_log;
  17. ID DEALTIME    DEALTYPE
  18. --------------------------------------- ----------- ----------
  19. 3 2014/7/16 1 insert

MySQL:声明位置在触发时的执行语句块内部

[plain] view plain copy
  1. mysql> delimiter $
  2. CREATE TRIGGER trigger_test_insert
  3. BEFORE INSERT ON test
  4. FOR EACH ROW
  5. BEGIN
  6. DECLARE id1 int DEFAULT 1;
  7. DECLARE id2 int DEFAULT 1;
  8. insert into test_log values(id1+id2,now(),'insert');
  9. END$
  10. delimiter ;
  11. Query OK, 0 rows affected
  12. mysql> insert into test(id, name) values(1, 'name');
  13. Query OK, 1 row affected
  14. mysql> select * from test_log;
  15. +----+------------+----------+
  16. | id | dealtime   | dealtype |
  17. +----+------------+----------+
  18. |  2 | 2014-07-16 | insert   |
  19. +----+------------+----------+
  20. 1 row in set

3,注释符不同

Oracle:使用/* */作为注释符,或者两个连续的-作为注释符(PL/SQL块中至少包含一条可执行语句)

[sql] view plain copy
  1. CREATE OR REPLACE TRIGGER trigger_test_insert
  2. BEFORE INSERT ON test
  3. FOR EACH ROW
  4. BEGIN
  5. --just a test
  6. /* just a test */
  7. null;
  8. END;
  9. /

MySQL:使用/* */作为注释符,或者两个连续的-后加一个空格作为注释符

[sql] view plain copy
  1. delimiter $
  2. CREATE TRIGGER trigger_test_insert
  3. BEFORE INSERT ON test
  4. FOR EACH ROW
  5. BEGIN
  6. /* just a test */
  7. -- 两个‘-’后面必须带空格
  8. END$
  9. delimiter ;

4,赋值语法不同

Oracle:可以通过select into语句赋值,还可以通过:=进行赋值

[plain] view plain copy
  1. SQL> CREATE OR REPLACE TRIGGER trigger_test_insert
  2. 2     BEFORE INSERT ON test
  3. 3     FOR EACH ROW
  4. 4  DECLARE id int;
  5. 5  BEGIN
  6. 6     select max(tl.id) into id from test_log tl;
  7. 7     if id is null then
  8. 8         id:=1;
  9. 9     else
  10. 10         id:=id+1;
  11. 11     end if;
  12. 12     insert into test_log values(id,sysdate,'insert');
  13. 13  END;
  14. 14  /
  15. Trigger created
  16. SQL> insert into test(id, name) values(1, 'name');
  17. 1 row inserted
  18. SQL> commit;
  19. Commit complete
  20. SQL> select * from test_log;
  21. ID DEALTIME    DEALTYPE
  22. --------------------------------------- ----------- ----------
  23. 1 2014/7/16 1 insert

MySQL:可以通过select into语句赋值,还可以通过set语句进行赋值

[plain] view plain copy
  1. mysql> delimiter $
  2. CREATE TRIGGER trigger_test_insert
  3. BEFORE INSERT ON test
  4. FOR EACH ROW
  5. BEGIN
  6. DECLARE id int;
  7. select max(tl.id) into id from test_log tl;
  8. if id is null then
  9. set id=1;
  10. else
  11. set id=id+1;
  12. end if;
  13. insert into test_log values(id,now(),'insert');
  14. END$
  15. delimiter ;
  16. Query OK, 0 rows affected
  17. mysql> insert into test(id, name) values(1, 'name');
  18. Query OK, 1 row affected
  19. mysql> select * from test_log;
  20. +----+------------+----------+
  21. | id | dealtime   | dealtype |
  22. +----+------------+----------+
  23. |  1 | 2014-07-16 | insert   |
  24. +----+------------+----------+
  25. 1 row in set

5,对于行级更新触发器

Oracle:原有行用:old表示,新行用:new表示

[plain] view plain copy
  1. SQL> CREATE OR REPLACE TRIGGER trigger_test_update
  2. 2         BEFORE UPDATE ON test
  3. 3         FOR EACH ROW
  4. 4  BEGIN
  5. 5         :new.description := 'change name[' ||
  6. 6                          :old.name || ']->[' ||
  7. 7                          :new.name || ']';
  8. 8  END;
  9. 9  /
  10. Trigger created
  11. SQL> insert into test(id, name) values (1, 'aaa');
  12. 1 row inserted
  13. SQL> commit;
  14. Commit complete
  15. SQL> update test set name = 'bbb' where id = 1;
  16. 1 row updated
  17. SQL> commit;
  18. Commit complete
  19. SQL> select id, name, description from test;
  20. ID NAME       DESCRIPTION
  21. --------------------------------------- ---------- ----------------------
  22. 1 bbb        change name[aaa]->[bbb]

MySQL:原有行用old表示,新行用new表示

[plain] view plain copy
  1. mysql> delimiter $
  2. CREATE TRIGGER trigger_test_update
  3. BEFORE UPDATE ON test
  4. FOR EACH ROW
  5. BEGIN
  6. set new.description = concat('change name[',
  7. old.name,']->[',new.name,']');
  8. END$
  9. delimiter ;
  10. Query OK, 0 rows affected
  11. mysql> insert into test(id, name) values (1, 'aaa');
  12. Query OK, 1 row affected
  13. mysql> update test set name = 'bbb' where id = 1;
  14. Query OK, 1 row affected
  15. Rows matched: 1  Changed: 1  Warnings: 0
  16. mysql> select id, name, description from test;
  17. +----+------+-------------------------+
  18. | id | name | description             |
  19. +----+------+-------------------------+
  20. |  1 | bbb  | change name[aaa]->[bbb] |
  21. +----+------+-------------------------+
  22. 1 row in set

6,其它一些语法、函数上的区别

Oracle:使用if...elsif...else

MySQL:使用if...elseif...else

Oracle:sysdate指代系统时间

MySQL:sysdate()指代系统时间

Oracle触发器和MySQL触发器之间的区别相关推荐

  1. Oracle中用户和架构之间的区别?

    本文翻译自:Difference between a user and a schema in Oracle? Oracle中的用户和架构有什么区别? #1楼 参考:https://stackoom. ...

  2. 什么是触发器?MySQL触发器概念及其应用解析

    什么是触发器? 触发器是一种与表操作( INSERT.UPDATE.DELETE)有关的数据库对象.触发器定义了一系列操作,这一系列操作称为触发程序.当触发器所在表上出现INSERT.UPDATE以及 ...

  3. mysql索引之间的区别

    2019独角兽企业重金招聘Python工程师标准>>> mysql索引类型: ①主键索引:与唯一索引之间的区别就在于不允许有空值,创建主键时会自动创建此索引. ②普通索引:最基本的索 ...

  4. oracle nls_nchar_characterset,Oracle的NLS_NCHAR_CHARACTERSET和NLS_CHARACTERSET之间的区别

    我在这里有一个简单的问题,我想知道oracle中NLS_NCHAR_CHARACTERSET和NLS_CHARACTERSET设置之间的区别? 根据我的理解,NLS_NCHAR_CHARACTERSE ...

  5. 浅谈tidb事务与MySQL事务之间的区别

    MySQL是我们日常生活中常见的数据库,他的innodb存储引擎尤为常见,在事务方面使用的是扁平事务,即要么都执行,要么都回滚.而tidb数据库则使用的是分布式事务.两者都能保证数据的高一致性,但是在 ...

  6. oracle 修改nls_nchar_characterset,Oracle的NLS_NCHAR_CHARACTERSET和NLS_CHARACTERSET之间的区别...

    一般来说,所有要点都是正确的. NLS_NCHAR_CHARACTERSET定义NVARCHAR2等的字符集.人.列,而NLS_CHARACTERSET用于VARCHAR2. Why is it po ...

  7. mysql触发器大全

    在研究MySQL触发器经历几番波折之后,我终于决定写下这篇MySQL触发器的使用介绍,以便后来人! 一.mysql触发器的作用及语法 触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触 ...

  8. mariadb mysql版本对应_弹指神通MariaDB——MariaDB与MySQL各版本的区别

    1 MariaDB的性质 MariaDB从MySQL衍生而来,作为完全开源的一款数据库产品.关于MariaDB更详细的信息其实是在MariaDB.org中.在MariaDB download中也做了详 ...

  9. mysql触发器主机自动增长_三分钟带你分清 Mysql 和 Oracle 之间的误区

    摘要:Mysql 和Oracle,别再傻傻分不清. mysql 和Oracle 在开发中的使用是随处可见的,那就简单去了解一下这俩款火的不行的数据库. 本质区别: Oracle数据库是一个对象关系数据 ...

最新文章

  1. LeetCode:144_Binary Tree Preorder Traversal | 二叉树的前序遍历 | Medium
  2. esxi安装ghost win7_针对Win7远程桌面的攻击实践(完美)
  3. 使用reactjs做一个CRUD功能
  4. windows server2008R2故障转移群集
  5. 基于机器学习的捡球机器人设计与实现(探索)第1篇——树莓派系统的安装与配置(20190106)
  6. Spring DI(依赖注入)
  7. 杭电3790最短路径问题
  8. 通过分析系统日志,统计你的电脑开机时间的小程序PC PowerOn Time,附源码
  9. PHP截取中文字符串的方法
  10. 17. 信号量,共享内存和消息队列
  11. SU插件情报局 | 坯子助手工具详解
  12. xctf crazy
  13. MacBook Pro 2018款充电口不能用解决办法
  14. GIT - 安装、设置和帮助
  15. 3060ti海力士测试
  16. python整体向右缩进两个级别_关于python:IndentationError:unindent与任何外部缩进级别都不匹配...
  17. Working Practice-破窗理论与写代码
  18. 《三国志》历代记(1)
  19. C语言switch的用法详解
  20. 中国矿业大学计算机学院刘茗,中国矿业大学(徐州)计算机科学与技术学院研究生导师:刘兵...

热门文章

  1. 如何在mysql中添加复选框_如何使用输入和复选框更新mysql
  2. 大整数乘法c语言数组,很大的数相乘怎么办?
  3. 海天食品的java开发工作如何_再三个月就秋招了,我想找一份java开发工作,现在应该怎么准备一下?...
  4. 计算机相关专业的自我评价,计算机相关专业的学生自我评价
  5. php ssh 管理服务器,php 利用ssh执行远程或本地liunx服务器命令
  6. ip地址合不合法怎么看_电子印章合不合法?两部门再发意见认定
  7. 计算机控制基础知识,最新 分析计算机控制系统及其运算基础知识-精品
  8. C++ ACM模式输入输出
  9. TVM:使用Tensor Expression (TE)来处理算子
  10. 潜流式湿地计算_人工湿地计算书