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的简单区别 归纳下我遇到最常见的问题。 1.在ORACLE中用select * from all_users显示所有的用户,而在MYSQL中显示所有数据库的命令是show databases。对于我的理解,ORACLE项目来说一个项目就应该...
一、触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 ...二、Oracle 使用 PL/SQL 编写触发器 1.–PL/SQL创建触发器的一般语法 create [or replace] trigger trigg
Oracle和MySQL在触发器上的一些差异.pdf
主要介绍了MySQL与Oracle 差异比较之六触发器,需要的朋友可以参考下
很准确,很全面。尤其适合做数据库迁移的猿宝宝。包括以下几个方面的比较:数据类型,基本语法,函数,循环语句,存储过程,触发器,用户权限,其他。
下面实验创建ON COMMIT 的FAST刷新模式,在mysql中用触发器实现insert , update , delete 刷新操作 1、基础表创建,Orders 表为基表,Order_mv为物化视图表 代码如下: mysql> create table Orders( -> order_id int...
MySQL 触发器简单实例 语法 CREATE TRIGGER <触发器名称> –触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象. { BEFORE | AFTER } –触发器有执行的时间设置:...
平常时写触发器(TRIGGER),一般会分别写插入(INSERT),删除(DELETE)和更新(UPDATE)单独的触发器
Michael McLaughlin,OracleACE,是美国爱达荷州杨百翰大学计算机信息技术系教授,Michael参与Oracle公司系列产品的研发已经有20年了,担任过开发者、DBA,以及电子商务套件应用程序DBA。 他在咨询、支持和开发方面...
基于SQL语言MySQL数据库应用程序及其代码方案; MySQL是一种关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle...8. 支持存储过程和触发器:MySQL支持创建存储过程和触发器,简化了数据库编程和维护工作
本工具用于对比SQL数据库支持mysql、sqlserver、oracle,以源数据库为标准 数据库, 然后拿目标数据库与标准数据库比较,如果目标数 据库少 了表,或少了字段,或字段类型长度不一样,或索引 不一样, 或存储过程,...
本工具用于对比SQL数据库支持mysql、sqlserver、oracle,以源数据库为标准 数据库, 然后拿目标数据库与标准数据库比较,如果目标数 据库少 了表,或少了字段,或字段类型长度不一样,或索引 不一样, 或存储过程,...
MySQL是一个流行的开源关系型数据库管理系统,由于其灵活性和易用性,成为...Sun继续投入资源来推动MySQL的发展,并在2008年发布了MySQL 5.1版本,引入了复制、触发器和分区等功能。 2010年,Oracle收购了Sun Micros
alter语句.txt Java处理高并发量访问的处理.txt ...sq和oracle的区别.txt sysobjects中type字段值意思txt W3School例句.txt 按照中文首字母排序.txt 笔记.txt 查询字段是否有默认值约束.bxt 触发器学习.bxt
初学mysql时,可能不太明白delimiter的真正用途,delimiter在mysql很多地方出现,比如存储过程、触发器、函数等。 学过oracle的人,再来学mysql就会感到很奇怪,百思不得其解。 其实就是告诉mysql解释器,该段命令...
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 ...
该软件可以连接您的远程数据库或者您的本地数据库,并与 Amazon RDS,Amazon Aurora、Oracle Cloud 和 Google Cloud 等云数据库兼容,并支持大部份MySQL的功能,包括触发器、存储过程、函数、事件、视图、管理用户等...
Navicat for MySQL软件可以让数据库管理员可以方便轻松的管理mysql数据库,比如创建数据表、触发器、存储过程、函数、视图等。友好的gui界面为数据库管理人员节约了大量的时间,降低了企业的开发成本。 新版本...