Oracle触发器和MySQL触发器之间的区别

原文链接: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.    
  9. Trigger created  
  10.    
  11. SQL> insert into test(id, name) values(1, 'name');  
  12.    
  13. 1 row inserted  
  14.    
  15. SQL> commit;  
  16.    
  17. Commit complete  
  18.    
  19. SQL> select * from test_log;  
  20.    
  21.                                      ID DEALTIME    DEALTYPE  
  22. --------------------------------------- ----------- ----------  
  23.                                       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.   
  11. mysql> insert into test(id, name) values(1, 'name');  
  12. Query OK, 1 row affected  
  13.   
  14. mysql> select * from test_log;  
  15. +----+------------+----------+  
  16. | id | dealtime   | dealtype |  
  17. +----+------------+----------+  
  18. |  1 | 2014-07-16 | insert   |  
  19. +----+------------+----------+  
  20. 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.    
  12. Trigger created  
  13.    
  14. SQL> insert into test(id, name) values(1, 'name');  
  15.    
  16. 1 row inserted  
  17.    
  18. SQL> commit;  
  19.    
  20. Commit complete  
  21.    
  22. SQL> select * from test_log;  
  23.    
  24.                                      ID DEALTIME    DEALTYPE  
  25. --------------------------------------- ----------- ----------  
  26.                                       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.   
  12. Query OK, 0 rows affected  
  13.   
  14. mysql> insert into test(id, name) values(1, 'name');  
  15. Query OK, 1 row affected  
  16.   
  17. mysql> select * from test_log;  
  18. +----+------------+----------+  
  19. | id | dealtime   | dealtype |  
  20. +----+------------+----------+  
  21. |  2 | 2014-07-16 | insert   |  
  22. +----+------------+----------+  
  23. 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.    
  16. Trigger created  
  17.    
  18. SQL> insert into test(id, name) values(1, 'name');  
  19.    
  20. 1 row inserted  
  21.    
  22. SQL> commit;  
  23.    
  24. Commit complete  
  25.    
  26. SQL> select * from test_log;  
  27.    
  28.                                      ID DEALTIME    DEALTYPE  
  29. --------------------------------------- ----------- ----------  
  30.                                       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.   
  17. Query OK, 0 rows affected  
  18.   
  19. mysql> insert into test(id, name) values(1, 'name');  
  20. Query OK, 1 row affected  
  21.   
  22. mysql> select * from test_log;  
  23. +----+------------+----------+  
  24. | id | dealtime   | dealtype |  
  25. +----+------------+----------+  
  26. |  1 | 2014-07-16 | insert   |  
  27. +----+------------+----------+  
  28. 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.    
  11. Trigger created  
  12.    
  13. SQL> insert into test(id, name) values (1, 'aaa');  
  14.    
  15. 1 row inserted  
  16.    
  17. SQL> commit;  
  18.    
  19. Commit complete  
  20.    
  21. SQL> update test set name = 'bbb' where id = 1;  
  22.    
  23. 1 row updated  
  24.    
  25. SQL> commit;  
  26.    
  27. Commit complete  
  28.    
  29. SQL> select id, name, description from test;  
  30.    
  31.                                      ID NAME       DESCRIPTION  
  32. --------------------------------------- ---------- ----------------------                                        
  33.                                       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.   
  11. Query OK, 0 rows affected  
  12.   
  13. mysql> insert into test(id, name) values (1, 'aaa');  
  14. Query OK, 1 row affected  
  15.   
  16. mysql> update test set name = 'bbb' where id = 1;  
  17. Query OK, 1 row affected  
  18. Rows matched: 1  Changed: 1  Warnings: 0  
  19.   
  20. mysql> select id, name, description from test;  
  21. +----+------+-------------------------+  
  22. | id | name | description             |  
  23. +----+------+-------------------------+  
  24. |  1 | bbb  | change name[aaa]->[bbb] |  
  25. +----+------+-------------------------+  
  26. 1 row in set  

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

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

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

Oracle:sysdate指代系统时间

MySQL:sysdate()指代系统时间

 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

下列选项中不符合python语言变量命名规则的是_学习Python第二日--基本概念和类型...

编程语言分类:解释型语言和编译型语言。解释型语言不会产生额外的文件,运行时一行一行的翻译。编译型语言需要产生一个额外的文件,是电脑能够识别的内容,运行后将产生额外的文件。 变量是可变的量,是它的值可以发生改变。变量的作用是保存值,保存的值可以是数据,而且保存…

HashMap死锁原因及替代方案

原文链接:http://blog.csdn.net/fhzaitian/article/details/51505516 ------------------------------------------------------------------------1、首先我们需要简单地了解一下HashMap数据结构 HashMap通常会用一个指针数组(假设为table[]&#xff09…

优化mysql数据库_MySQL数据库十大优化技巧

WEB开发者不光要解决程序的效率问题,对数据库的快速访问和相应也是一个大问题。希望本文能对大家掌握MySQL优化技巧有所帮助。1. 优化你的MySQL查询缓存在MySQL服务器上进行查询,可以启用高速查询缓存。让数据库引擎在后台悄悄的处理是提高性能的最有效方…

跋山涉水——深入 Redis 字典遍历

Redis 字典的遍历过程逻辑比较复杂,互联网上对这一块的分析讲解非常少。我也花了不少时间对源码的细节进行了整理,将我个人对字典遍历逻辑的理解呈现给各位读者。也许读者们对字典的遍历过程有比我更好的理解,还请不吝指教。一边遍历一边修改…

linux下VI模式中上下左右键和回退键出现字母

原文地址:http://blog.csdn.net/u012860950/article/details/50127779 ---------------------------------------------------------------- 1.编辑/etc/vim/vimrc.tiny 由于/etc/vim/vimrc.tiny的拥有者是root用户,所以要在root的权限下对这个文件进行修…

mysql数据库查询优化建议_mysql数据库查询优化的24条建议

MySQL是一个强大的开源数据库。随着MySQL上的应用越来越多,MySQL逐渐遇到了瓶颈。这里提供一些关于Mysql 数据库查询优化的24条优化建议,仅供参考。Mysql 查询优化1、使用慢查询日志,找出执行慢的查询。2、使用 EXPLAIN 来决定查询功能是否合…

常规sql读取CLOB

plsql下,普通sqlsql-cmd下总结: 常规的sql,查询clob字段,只能显示部分内容。 查clob内容select dbms_lob.substr(c_content) from table_content t dbms_lob.substr将大文本转换字符类型读出来.dbms_lob.substr的转换对字段conten…

精解 ES6箭头函数

🐱 个人主页:SHOW科技,公众号:SHOW科技 🙋‍♂️ 作者简介:2020参加工作,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫优质专栏&#x…

硬盘主引导记录详解

说明:硬盘主引导记录独立于操作系统,但又和操作系统息息相关——很多时候它又是由; 操作系统所提供的工具所生成(例外的情况是您使用了其他的分区工具,不过它又运行在; 什么操作系统中呢?;()。;; 如果您安装…

Oracle char varchar varchar2 nvarchar2 的区别

上面字符类型能保存多少个字符与oracle当前的字符集有关系。 select userenv(language) from dual; 假设长度2000字节, 如果字符集是16位编码的,ZHS16GBK,那么每个字符16位,2字节,所以可以容纳1000字符。 如果是32位编…

树莓派lnmp安装mysql_在树莓派上安装 LNMP

树莓派支持安装非常多的操作系统,如官方所展示:这里我选择了推荐的 Raspbian 系统,它基于 Debian,这就意味着我可以按照 Debian 的方式来安装软件。一、安装 Nginx0、先将系统更新到最新状态$ sudo apt-get update && sud…

openlayers5之热力图heatmap

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gisdoer/article/details/81745645 openlayers5之热力图 点击查看文章

maven项目在打war包时出现非法字符: '\ufeff' 解决方案

http://blog.csdn.net/qi_fei/article/details/61416319 --------------------------------------------问题描述: 开发工具MyEclipse 的总体开发环境,编码格式总体设置为UTF-8,在将web项目打包的时候出现:非法字符:\u…

0027-生成圆

题目 生成圆难度级别:A; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B 试题描述给你一些特殊的圆,每个这样的圆每秒可以产生一个普通的圆,如果给你…

mysql启多_MySQL启多个实例

很多朋友都想在一台服务器上运行多个MySQL Instance,究竟怎么做呢?首先要明晰几个原理, 简称为mysqld读取my.cnf的顺序:第一搜,首先读取/etc/my.cnf,多实例这个配置文件不会存在。:-(第二搜&…

数据连接池druid 和 大数据框架druid

叫druid的有两个开源项目。 一个是:Druid是一个JDBC组件,它包括三部分: DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。 DruidDataSource 高效可管理的数据库连接池。 SQLParser 另一个是&#xff…

零基础入门深度学习(5) - 循环神经网络

往期回顾 在前面的文章系列文章中,我们介绍了全连接神经网络和卷积神经网络,以及它们的训练和使用。他们都只能单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息&am…

sql排名名次分页mysql_mysql 实现排名及中文排序实例[分页累加行号]

/*排名相同情况下,优先按姓名排序*/SELECT t.name, t.company_name, rownum:rownum1 as rankNum, t.ss from (SELECT u.name, sci.company_name, rownum:0,(u.check_numu.online_hours) as ss FROM v_user uLEFT JOIN sys_company_info sci ON u.companyId sci.com…

世上最简单的mysql_史上最简单安装MySQL教程

1.安装MySQL很多都推荐在MySQL官网进行安装,我刚开始试的时候官网下载zip文件,打开完全找不到,踩坑了后面我发现了Windows简易安装,俗称傻子都会安装安装好了就会看到一个这个文件安装之前首先你的有没有这个你就无法安装,这个可以去这里进行下载安装好了就可以安装MySQL了因为…

linux下ftp配置文件详解

# 匿名用户配置 anonymous_enableYES # 是否允许匿名ftp,如否则选择NO anon_upload_enableYES # 匿名用户是否能上传 anon_mkdir_write_enableYES # 匿名用户是否能创建目录 anon_other_write_enableYES # 修改文件名和删除文件 # 本地用户配置 …