mysql触发器有几种(mysql数据库中一个表可以有多少个触发器)
本文目录
mysql数据库中一个表可以有多少个触发器
可以更新,删除,插入触发器,不同种类的触发器可以存在于同一个表,但同种类的不能有多个。一个更新、一个删除是可以共存的。
mysql的触发器和oracle触发器的区别
oracle触发器格式:在CODE上查看代码片派生到我的代码片CREATE TRIGGER trigger_name BEFORE|AFTER INSERT|UPDATE|DELETE ON table_name DECLARE arg_name type BEGIN pl/sql语句 END MySQL触发器格式:在CODE上查看代码片派生到我的代码片CREATE TRIGGER trigger_name BEFORE|AFTER INSERT|UPDATE|DELETE ON table_name BEGIN DECLARE arg_name1 sql语句 END 创建测试表(建表语句适用于Oracle、MySQL):在CODE上查看代码片派生到我的代码片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客户端设置的自动提交)在CODE上查看代码片派生到我的代码片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在CODE上查看代码片派生到我的代码片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)时,不需要修改触发器)在CODE上查看代码片派生到我的代码片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:声明位置在触发时的执行语句块内部在CODE上查看代码片派生到我的代码片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块中至少包含一条可执行语句)在CODE上查看代码片派生到我的代码片CREATE OR REPLACE TRIGGER trigger_test_insert BEFORE INSERT ON test FOR EACH ROW BEGIN --just a test /* just a test */ null; END; / MySQL:使用/* */作为注释符,或者两个连续的-后加一个空格作为注释符在CODE上查看代码片派生到我的代码片delimiter $ CREATE TRIGGER trigger_test_insert BEFORE INSERT ON test FOR EACH ROW BEGIN /* just a test */ -- 两个‘-’后面必须带空格 END$ delimiter ; 4,赋值语法不同Oracle:可以通过select into语句赋值,还可以通过:=进行赋值在CODE上查看代码片派生到我的代码片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语句进行赋值在CODE上查看代码片派生到我的代码片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表示在CODE上查看代码片派生到我的代码片SQL》 CREATE OR REPLACE TRIGGER trigger_test_update 2 BEFORE UPDATE ON test 3 FOR EACH ROW 4 BEGIN 5 :new.description := ’change 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 | +----+------+-------------------------+ 1 row in set 6,其它一些语法、函数上的区别Oracle:使用if...elsif...elseMySQL:使用if...elseif...elseOracle:sysdate指代系统时间MySQL:sysdate()指代系统时间
MySQL如何用触发器实现新增时删除最后一条数据
首先mysql 只支持3种触发器1 DELETE 2 INSERT 3 UPDATE其他的MySQL语句不支持触发器,所以你第二个需求不能用触发器实现。其次是 非常遗憾,MYSQL中触发器中不能对本表进行 insert ,update ,delete 操作,以免递归循环触发。所以你第一个需求不能在insert前删除本表数据对于update 能用set 进行操作替换,insert与delete只能借助第二张表才能实现需要的目的。
mysql触发器
create trigger 触发器名称 after/before insert/update/delete on 表名 for each row begin sql 语句—一个或者多个语句范围在 insert/update/delete内; end
mysql 触发器
create trigger 触发器名称after/befor (触发时间)insert/update/delete (监视事件)on 表名 (监视地址) for each rowbeginsql1;..sqlN;end其实这里可以不用触发器的,像这种功能的很多,课程和成绩是一对多,学生和课程也是一对多,把这些依赖关系弄清楚,弄确定弄好后,你删除一条字典表的信息后,对应的子表的信息也会被删的!
Mysql触发器
主要是第7行 if @score》85 这个地方缺少 then了 , 注意 if ... then 组合或者使用下面的语句:mysql》 DELIMITER |mysql》 create trigger set_record after insert on score -》 for each row begin -》 set @studentid=new.student_id; -》 set @record=new.record; -》 set @score=new.score; -》 if @score》85 then -》 update score set score.record=5 where student_id=@studentid; -》 else if @score》70 then -》 update score set sc.record=4 where student_id=@studentid; -》 else if @score》60 then -》 update score set score.record=3 where student_id=@studentid; -》 else -》 update score set score.record=0 where student_id=@studentid; -》 end if; -》 end; -》 |
更多文章:
nba2k14中文版下载官网(现在在哪可以直接下载NBA2K14呢)
2024年7月11日 16:20
血色修道院掉落(魔兽世界血色修道院血色套装掉落几率及掉落地点准确的)
2024年6月21日 14:26
exagear模拟器下载(exagear模拟器怎么添加游戏)
2024年6月29日 18:38
死神vs火影网页游戏(火影VS海贼王VS死神格斗的网址谁有好像是flash的)
2024年7月15日 23:20