我是靠谱客的博主 威武帅哥,这篇文章主要介绍关系型数据库MySQL之触发器和表数据操作,现在分享给大家,希望可以做个参考。

一、触发器(TRIGGER)

触发器是MySQL的数据库对象之一,该对象与编程语言中的函数非常类似,都需要申明、执行等。

1.1、 创建触发器

1> 创建有一条执行语句的触发器

创建触发器通过SQL语句CREATE TRIGGER 来实现,其语法形式如下:

复制代码
1
2
3
Create trigger trigger_name BEFORE|AFTTER trigger_EVENT ON TABLE_NAME FOR EACH ROW trigger_STMT;

解释:trigger_name参数表示所要创建的触发器名字,在具体创建触发器时,触发器标识符不能与已存在的触发器重复,建议触发器的名字命名为trigger_XXX或者tri_XXX;BEFORE和AFTER参数指定了触发器执行时间,其中前者是指在触发器事件之前执行触发器语句,后者是指在触发器事件之后执行触发器语句; trigger_EVENT表示触发事件,即触发器执行条件,包含DELETE、INSERT、UPDATE语句;TABLE_NAME参数表示触发事件操作表的名字;FOR EACH ROW 参数表示任何一条记录上的操作满足触发事件都会触发该触发器;trigger_STMT参数表示激活触发器后被执行的语句。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
Create table t_diary(diaryno int,tablename varchar(20),diarytime datetime); CREATE TABLE `t_dept` ( `loc` varchar(40) DEFAULT NULL, `dname` varchar(20) DEFAULT NULL, `deptno` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 eg:create trigger tri_diarytime Before insert on t_dept for each row Insert into t_diary values(NULL,’t_dept’,now()); ##该触发器当向t_dept表中插入任意一条数据时,就会在插入之前向表t_diary中插入当前时间。 Insert into t_dept values (’haidian’,’caiwudept’,1); Select * from t_diary;

2> 创建包含多条执行语句的触发器

语法形式如下:

复制代码
1
2
3
4
5
6
Create trigger trigger_name Before|after trigger_EVENT ON table_name for each row BEGIN Trigger_STMT END;

在mysql中,一般使用“;”符号作为语句的结束符号,可是在创建触发器时需要用到“;”符号作为语句的结束符号。为了解决这个问题,可以使用关键字delimiter语句,例如:“DELIMITER $$”,可以用来实现将结束符号设置成“$$”。

复制代码
1
2
3
4
5
6
7
8
9
10
eg:DELIMITER $$ CREATE TRIGGER tri_diarytime2 AFTER INSERT ON t_dept for each row Begin Insert into t_diary values(NULL,’t_dept’,now()); Insert into t_diary values(NULL,’t_dept’,now()); End $$ DELIMITER ;

上述语句中,通过“DELEMITER $$”语句设置结束符号为“$$”;然后在BEGIN和END之间编写了执行语句列表,最后通过“DELEMITER ;”语句将结束符号还原成默认结束符号“;”。

复制代码
1
2
Insert into t_dept values(‘chaoyang’,’xinxi’20); Select * from t_diary;

1.2、 查看触发器

1> 通过show triggers语句查看触发器

定义好触发器之后,可以使用:

复制代码
1
show triggersG

查看触发器的详细信。

2> 也可通过查看系统表triggers实现查看触发器

在数据库Information_schema中可使用如下语句查看触发器:

复制代码
1
2
Use Information_schema; Desc triggers;

注意:删除t_dept表时所建立的触发器将不复存在,建立触发器时要写正确名字,不能有中文符号。

1.3、 删除触发器

MySQL5.5中删除触发器使用drop trigger语句:

复制代码
1
2
Eg:drop trigger tri_diarytime; Show triggers G

二、表数据操作

表数据操作此次主要是对插入、更改、删除(insert、update、delete)这三个方面进行简单的操作。

2.1插入数据

  • 插入完整数据记录
  • 插入数据记录一部分
  • 插入多条数据记录
  • 插入查询结果

补充:建完表后设置表的字段主键约束和自动增加:

复制代码
1
alter table t_dept add primary key auto_increment(deptno);

建完表后设置表的字段为默认值:

复制代码
1
2
alter table t_dept alter column deptno set default 10;

2.1.1插入完整数据记录

插入完成记录通过insert into 语句来实现;语法如下:

复制代码
1
2
3
4
5
6
7
8
INSERT INTO TAB_NAME(F1,F2,F3,F4,…Fn) VALUES(V1,V2,V3,V4,…Vn); #列名要和值一一对应 或者:INSERT INTO TAB_NAME VALUES(V1,V2,V3,V4,…Vn); eg: desc t_dept; insert into t_dept(loc,dname,deptno) values(‘beijing’,’orgino’,11);

2.1.2插入数据记录一部分,语法如下:

复制代码
1
2
3
4
5
INSERT INTO TAB_NAME(F1,F2,F3,F4,…Fn) VALUES(V1,V2,V3,V4,…Vn); #列名要和值一一对应 eg: desc t_dept; insert into t_dept(dname,deptno) values(’services’,11);

2.1.3插入多条数据记录

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
INSERT INTO TAB_NAME(F1,F2,F3,F4,…Fn) VALUES(V11,V12,V13,V14,…V1n), (V21,V22,V23,V24,…V2n), (V31,V32,V33,V34,…V3n), (Vm1,Vm2,Vm3,Vm4,…Vmn); #列名要和值一一对应 或者:INSERT INTO TAB_NAME VALUES(V11,V12,V13,V14,…V1n), (V21,V22,V23,V24,…V2n), (V31,V32,V33,V34,…V3n), (Vm1,Vm2,Vm3,Vm4,…Vmn); #列名要和值一一对应 eg:inset into t_dept values(‘haidian1’,’xinxi1’,1), (‘haidian2’,’xinxi2’,2), (‘haidian3’,’xinxi3’,3), (‘haidian4’,’xinxi4’,4); Select * from t_dept;

2.1.4插入查询结果

通过查看帮助文档还可以使用查询结果插入到表中,具体语法结构如下:

复制代码
1
2
3
4
5
6
7
8
9
10
INSERT INTO Tab_name1(F1,F2,…Fn) Select (F1,F2,…Fn) From tab_name2 Where … eg: create table t_loder(id int,name varchar(20),dname varchar(40),loc varchar(40)); insert into t_loder values(1,'gsau1','dept1','chaoyaang1'); insert into t_loder(id,name,dname) values(2,'gsau2','dept2'); insert into t_loder values(3,'gsau3','dept3','chaoyaang3'); insert into t_dept(loc,dname,deptno) select loc,dname,id from t_loder;

2.2更新数据

更新数据包括更新特定数据记录和更新所有数据记录。

2.2.1更新特定数据使用update,具体语法如下:

复制代码
1
2
3
4
5
6
UPDATE tab_name SET f1=v1,f2=v2 WHERE condition; eg:update t_dept set loc=’lanzhou’ where dname=’XINXI’;

2.2.2更新所有数据使用update,具体语法如下:

复制代码
1
2
3
UPDATE tab_name SET f1=v1,f2=v2,f3=v3 WHERE condition;

在上述语句中,为了更新所有的数据记录,参数condition需要满足表tab_name中所有的数据记录或者无关键字WHERE语句。

复制代码
1
2
3
4
5
eg:update t_dept set loc=’lanzhou’ where deptno<100; eg:update t_dept set loc=’gansu’;

注意:要是某个字段设置为主键唯一约束的话不能全部更新,不然会报错ERROR 1062 (23000): Duplicate entry ‘10’ for key ‘PRIMARY*’!*

2.3删除数据

删除数据包括删除特定数据记录和和删除所有记录。

2.3.1删除特定数据使用delete from,具体语法如下:

复制代码
1
2
3
4
5
DELETE FROM tab_name WHERE condition; eg:delete from t_dept where dname=’dept1’; select * from t_dept;

2.3.2删除所有数据使用delete from,具体语法如下:

复制代码
1
2
DELETE FROM tab_name WHERE condition;

在上述语句中,为了删除所有的数据记录,参数condition需要满足表tab_name中所有的数据记录或者无关键字WHERE语句。

复制代码
1
2
3
4
5
eg:delete from t_dept where deptno<=60; eg:delete from t_dept; # 删除整个表数据,但表结构依然存在 select * from t_dept;

注意:使用delete删除数据,但表结构依然存在,truncate也是删除数据结构依然存在,drop删除整个表包括结构。

三者区别具体如下所述:

程度从强到弱

复制代码
1
2
3
4
1、drop table tab_name; drop将表格直接删除,没有办法找回
复制代码
1
2
2、truncate (table) tab_name; 删除表中的所有数据,不能与where一起使用
复制代码
1
2
3、delete from tab_name (where) *删除表中的数据(可制定某一行)*

两者区别:truncate和delete的区别:

1、事务:truncate是不可以rollback的,但是delete是可以rollback的;原因:truncate删除整表数据(ddl语句,隐式提交),delete是一行一行的删除,可以rollback;

2、效果:truncate删除后将重新水平线和索引(id从零开始) ,delete不会删除索引;

3、truncate 不能触发任何Delete触发器;

4、delete 删除可以返回行数.

最后

以上就是威武帅哥最近收集整理的关于关系型数据库MySQL之触发器和表数据操作的全部内容,更多相关关系型数据库MySQL之触发器和表数据操作内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部