`
wuhuizhong
  • 浏览: 668025 次
  • 性别: Icon_minigender_1
  • 来自: 中山
社区版块
存档分类
最新评论

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

 
阅读更多

Oracle触发器格式:

 

CREATE [OR REPLACE] TRIGGER trigger_name 
	BEFORE|AFTER INSERT|UPDATE|DELETE ON table_name 
	[FOR EACH ROW]
DECLARE arg_name type [CONSTANT] [NOT NULL] [:=value] 
BEGIN
	pl/sql语句
END

 

 

 

MySQL触发器格式:

 

CREATE TRIGGER trigger_name
	BEFORE|AFTER INSERT|UPDATE|DELETE ON table_name
 	[FOR EACH ROW]
BEGIN
DECLARE arg_name1[,arg_name2,...] type [DEFAULT value]
   	sql语句
END
 
创建测试表(建表语句适用于Oracle、MySQL):
CREATE TABLE test(
  id            int,
  name          varchar(10),
  age           int,
  birthday      date,
  description   varchar(50),
  PRIMARY KEY (id)
);
CREATE TABLE test_log(
  id            int,
  dealtime      date,
  dealtype      varchar(10),
  PRIMARY KEY (`id`)
);
 

 

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

 

1,创建语句格式不同

 

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

SQL> CREATE OR REPLACE TRIGGER trigger_test_insert
  2         BEFORE INSERT ON test
  3         FOR EACH ROW
  4  BEGIN
  5         insert into test_log values(1,sysdate,'insert');
  6  END;
  7  /
 
Trigger created
 
SQL> insert into test(id, name) values(1, 'name');
 
1 row inserted
 
SQL> commit;
 
Commit complete
 
SQL> select * from test_log;
 
                                     ID DEALTIME    DEALTYPE
--------------------------------------- ----------- ----------
                                      1 2014/7/16 1 insert

 

 

MySQL:不包含or replace

mysql> delimiter $
CREATE TRIGGER trigger_test_insert  
	BEFORE INSERT ON test 
	FOR EACH ROW
BEGIN
	insert into test_log values(1,now(),'insert');
END$
delimiter ;
Query OK, 0 rows affected

mysql> insert into test(id, name) values(1, 'name');
Query OK, 1 row affected

mysql> select * from test_log;
+----+------------+----------+
| id | dealtime   | dealtype |
+----+------------+----------+
|  1 | 2014-07-16 | insert   |
+----+------------+----------+
1 row in set

 

 

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

 

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

 

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

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

 

 

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

mysql> delimiter $
CREATE TRIGGER trigger_test_insert  
	BEFORE INSERT ON test 
	FOR EACH ROW
BEGIN
	DECLARE id1 int DEFAULT 1;
	DECLARE id2 int DEFAULT 1;
	insert into test_log values(id1+id2,now(),'insert');
END$
delimiter ;

Query OK, 0 rows affected

mysql> insert into test(id, name) values(1, 'name');
Query OK, 1 row affected

mysql> select * from test_log;
+----+------------+----------+
| id | dealtime   | dealtype |
+----+------------+----------+
|  2 | 2014-07-16 | insert   |
+----+------------+----------+
1 row in set

 

 

3,注释符不同

 

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

CREATE OR REPLACE TRIGGER trigger_test_insert  
	BEFORE INSERT ON test 
	FOR EACH ROW
BEGIN
	--just a test
  /* just a test */
	null;
END;
/

 

 

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

delimiter $
CREATE TRIGGER trigger_test_insert  
	BEFORE INSERT ON test 
	FOR EACH ROW
BEGIN
	/* just a test */
	-- 两个‘-’后面必须带空格
END$
delimiter ;

 

 

4,赋值语法不同

 

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

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

 

 

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

mysql> delimiter $
CREATE TRIGGER trigger_test_insert  
	BEFORE INSERT ON test 
	FOR EACH ROW
BEGIN
	DECLARE id int;
	select max(tl.id) into id from test_log tl;
	if id is null then 
		set id=1;
	else 
		set id=id+1;
	end if;
	insert into test_log values(id,now(),'insert');
END$
delimiter ;

Query OK, 0 rows affected

mysql> insert into test(id, name) values(1, 'name');
Query OK, 1 row affected

mysql> select * from test_log;
+----+------------+----------+
| id | dealtime   | dealtype |
+----+------------+----------+
|  1 | 2014-07-16 | insert   |
+----+------------+----------+
1 row in set

 

 

5,对于行级更新触发器

 

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

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

 

 

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

mysql> delimiter $
CREATE TRIGGER trigger_test_update  
	BEFORE UPDATE ON test 
	FOR EACH ROW
BEGIN
	set new.description = concat('change name[',
		old.name,']->[',new.name,']');
END$
delimiter ;

Query OK, 0 rows affected

mysql> insert into test(id, name) values (1, 'aaa');
Query OK, 1 row affected

mysql> update test set name = 'bbb' where id = 1;
Query OK, 1 row affected
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select id, name, description from test;
+----+------+-------------------------+
| id | name | description             |
+----+------+-------------------------+
|  1 | bbb  | change name[aaa]->[bbb] |
+----+------+-------------------------+
1 row in set

 

 

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

 

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

 

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

 

Oracle:sysdate指代系统时间

 

MySQL:sysdate()指代系统时间

 

分享到:
评论

相关推荐

    oracle和mysql的区别

    使用ORACLE和MYSQL的简单区别 归纳下我遇到最常见的问题。 1.在ORACLE中用select * from all_users显示所有的用户,而在MYSQL中显示所有数据库的命令是show databases。对于我的理解,ORACLE项目来说一个项目就应该...

    Oracle使用触发器和mysql中使用触发器的案例比较

    一、触发器  1.触发器在数据库里以独立的对象存储,  2.触发器不需要调用,它由一个事件来触发运行 ...二、Oracle 使用 PL/SQL 编写触发器 1.–PL/SQL创建触发器的一般语法 create [or replace] trigger trigg

    Oracle和MySQL在触发器上的一些差异.pdf

    Oracle和MySQL在触发器上的一些差异.pdf

    MySQL与Oracle 差异比较之六触发器

    主要介绍了MySQL与Oracle 差异比较之六触发器,需要的朋友可以参考下

    Oracle与MySQL区别总结

    很准确,很全面。尤其适合做数据库迁移的猿宝宝。包括以下几个方面的比较:数据类型,基本语法,函数,循环语句,存储过程,触发器,用户权限,其他。

    mysql触发器实现oracle物化视图示例代码

    下面实验创建ON COMMIT 的FAST刷新模式,在mysql中用触发器实现insert , update , delete 刷新操作 1、基础表创建,Orders 表为基表,Order_mv为物化视图表 代码如下: mysql> create table Orders( -> order_id int...

    MySQL 触发器详解及简单实例

    MySQL 触发器简单实例 语法 CREATE TRIGGER <触发器名称> –触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象. { BEFORE | AFTER } –触发器有执行的时间设置:...

    判断触发器正在处理的是插入,删除还是更新触发

    平常时写触发器(TRIGGER),一般会分别写插入(INSERT),删除(DELETE)和更新(UPDATE)单独的触发器

    《Oracle Database 11g & MySQL 5.6开发手册

    Michael McLaughlin,OracleACE,是美国爱达荷州杨百翰大学计算机信息技术系教授,Michael参与Oracle公司系列产品的研发已经有20年了,担任过开发者、DBA,以及电子商务套件应用程序DBA。 他在咨询、支持和开发方面...

    基于SQL语言MySQL数据库应用程序及其代码方案

    基于SQL语言MySQL数据库应用程序及其代码方案; MySQL是一种关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle...8. 支持存储过程和触发器:MySQL支持创建存储过程和触发器,简化了数据库编程和维护工作

    数据库比对工具,支持mysql、sqlserver、oracle(win 32版)

    本工具用于对比SQL数据库支持mysql、sqlserver、oracle,以源数据库为标准 数据库, 然后拿目标数据库与标准数据库比较,如果目标数 据库少 了表,或少了字段,或字段类型长度不一样,或索引 不一样, 或存储过程,...

    数据库比对工具,支持mysql、sqlserver、oracle(win7版)

    本工具用于对比SQL数据库支持mysql、sqlserver、oracle,以源数据库为标准 数据库, 然后拿目标数据库与标准数据库比较,如果目标数 据库少 了表,或少了字段,或字段类型长度不一样,或索引 不一样, 或存储过程,...

    Mysql数据库引擎大揭秘

    MySQL是一个流行的开源关系型数据库管理系统,由于其灵活性和易用性,成为...Sun继续投入资源来推动MySQL的发展,并在2008年发布了MySQL 5.1版本,引入了复制、触发器和分区等功能。 2010年,Oracle收购了Sun Micros

    MySQL学习笔记、学习文档

    alter语句.txt Java处理高并发量访问的处理.txt ...sq和oracle的区别.txt sysobjects中type字段值意思txt W3School例句.txt 按照中文首字母排序.txt 笔记.txt 查询字段是否有默认值约束.bxt 触发器学习.bxt

    详解 Mysql中的delimiter定义及作用

    初学mysql时,可能不太明白delimiter的真正用途,delimiter在mysql很多地方出现,比如存储过程、触发器、函数等。 学过oracle的人,再来学mysql就会感到很奇怪,百思不得其解。 其实就是告诉mysql解释器,该段命令...

    如何用Toad调试存储过程、触发器

    Starting with the 10g release, Oracle now offers a new interface, known as JDWP, for debugging PL/SQL and stored Java procedures. Toad fully supports both interfaces, but we recommend you continue to ...

    MySQL15_47360.zip

    该软件可以连接您的远程数据库或者您的本地数据库,并与 Amazon RDS,Amazon Aurora、Oracle Cloud 和 Google Cloud 等云数据库兼容,并支持大部份MySQL的功能,包括触发器、存储过程、函数、事件、视图、管理用户等...

    Navicat for MySQL 10.1.7中文注册版

    Navicat for MySQL软件可以让数据库管理员可以方便轻松的管理mysql数据库,比如创建数据表、触发器、存储过程、函数、视图等。友好的gui界面为数据库管理人员节约了大量的时间,降低了企业的开发成本。 新版本...

Global site tag (gtag.js) - Google Analytics