mysql——触发器、视图、索引——前期整理笔记00

一、触发器

触发器是由事件来出发某个动作。这些事件包括insert语句、update语句和delete语句。

当数据库系统执行这些事件时,就会激活触发器执行相应得动作。

触发器是有insert、update、delete等事件来触发某种特定动作。满足触发器的触发条件时,数据库系统就会执行触发器中定义的程序语句。

这样做可以保证某些操作之间的一致性.


1、创建只有一个执行语句的触发器

语法格式:


         create trigger 触发器名 before|after 触发事件

         on 表名 for each row 执行语句


触发器名参数指要创建的触发器的名字;

before和after参数指定了触发器执行的时间;

   before指在触发事件之前执行触发语句;

   after指在触发事件之后执行触发语句;

触发事件指触发的条件,其中包括insert、update、delete;

表名指触发事件操作的表的名称;

for each row表示任何一条记录上的操作满足触发条件都会触发该触发器;

执行语句指触发器被触发后执行的程序;


举例:

create trigger dept_trig1 before insert

on department for each row

inert into trigger_time values(now());

注释:当向department表中执行insert操作时,数据库系统都会在insert语句执行之前向trigger_time表中插入当前时间;


2、创建有多个执行语句的触发器


语法格式:


         create trigger 触发器名 before|after 触发事件

         on 表名 for each row 


         begin

                执行语句列表

         end




执行语句列表表示需要执行的多个执行语句的内容,不同执行语句之间用分好隔开;


注意:

一般情况下,MYSQL默认的是以“;”作为结束执行语句。在创建触发器的过程中,需要用到“;”为了解决这个问题可以用delimiter语句

如“delimiter &&”可以将结束符号变为“&&”。当触发器创建完成之后,可以用命令“delimiter ;”来将结束符号变为“;”。


举例:


delimiter &&

create trigger dept_trig2 aftrer delete

on department for each row

begin
       insert into trigger_time values('21:01:01');
       insert into trigger_time values('22:01:01');
end

&&

delimiter;


注意:在MYSQL中,一个表在相同的触发时间,只能创建一个触发器;


3、查看触发器

(1)show triggers语句查看触发器信息

语法格式:show triggers;

注释:其结果显示了所有触发器的基本信息,但是该语句无法查询指定的触发器信息,只能查询所有的触发器信息,适合触发器较少时使用



(2)在triggers表中查看触发器信息

在MYSQL中,所有触发器的定义都存储在information_schema数据库下的triggers表中,

查询triggers表,可以查看到数据库中所有触发器的详细信息;

语法格式:select * from information_schema.triggers;


同时该方法可以查询指定触发器的详细信息。

语法格式:select * from information_schema.triggers where trigger_name='触发器名';



4、触发器的使用

before在触发事件之前执行,after在触发事件之后执行;

注意:触发器中不能包含start transaction、commit或者rollback等关键词,也不能包含call语句。



5、删除触发器

语法格式:drop trigger 触发器名;


=====================================================================================================================
=====================================================================================================================
=====================================================================================================================
=====================================================================================================================
=====================================================================================================================
=====================================================================================================================

create trigger 触发器名  before| after 触发事件
on 表名 for each row

执行语句;



delimiter &&
create trigger 触发器名  before| after 触发事件
on 表名 for each row
  begin
        执行语句列表
  end
  &&
delimiter;


触发事件是指触发条件,包括insert、update、delete;

表名指触发事件操作的表的名称;


=====================================================================================================================
=====================================================================================================================

create table employee ( num int(50),
                        d_id int(50),
                        name varchar(50),
                        age int(50),
                        sex varchar(50),
                        homeadd varchar(50)
                       );

insert into employee values(1,1001,'zhangsan',26,'nan','beijing');
insert into employee values(2,1001,'lisi',24,'nv','hunan');
insert into employee values(3,1002,'wangwu',25,'nan','jiangsu');
insert into employee values(4,1004,'aric',15,'nan','yingguo');

select * from employee;



create table department ( d_id int(50),
                          d_name varchar(50),
                          functione varchar(50),
                          address varchar(50)
                        );

insert into department values(1001,'keyanbu','yanfachanpin','3lou5hao');
insert into department values(1002,'shengchanbu','shengchanchanp','5louyiceng');
insert into department values(1003,'xiaoshoubu','cehuaxiaoshou','1louxiaoshoudating');

select * from department;

==========================================================================================

select * from employee;

select * from department;

==========================================================================================


create table trigger_time ( exec_time varchar(50)
                          );


select now();



create  trigger dept_trig1 before insert on department for each row insert into trigger_time values ( now() );



delete from department where d_id = 1003;


select * from department;


select * from trigger_time;

insert into department values(1003,'xiaoshoubu','cehuaxiaoshou','1louxiaoshoudating');


select * from trigger_time;

=================================================================================================================

select * from employee;


select * from department;

create table trigger_time1 ( exec_time varchar(50)
                          );

select now();

select * from trigger_time1;



delimiter &&
create  trigger dept_trig2 after delete on department for each row 
begin
      insert into trigger_time1 values ( now() );
      insert into trigger_time1 values ( now() );
end 
&&
delimiter;

select * from trigger_time1;

delete from department where d_id = 1003;

select * from trigger_time1;

=================================================================================

=================================================================================
查看触发器

1、查看数据库中所有触发器的信息:

show triggers;


2、在triggers表中查看触发器信息

mysql中所有触发器的定义都存在information_schema数据库下的triggers表中,查询triggers表,可以查询数据库中所有触发器的详细信息

select * from information_schema.triggers;   /*查询所有*/


select * from information_schema.triggers where trigger_name = 'dept_trig1';     /*单个指定查询*/


注意:在激活触发器时,对触发器中的执行语句存在一些限制。而且触发器有问题,会阻止程序向下执行,而且数据不能回滚。


3、删除触发器

drop trigger 触发器名;



select * from information_schema.triggers;


drop trigger dept_trig1;

drop trigger dept_trig2;

================================================================================================================================
================================================================================================================================
================================================================================================================================
================================================================================================================================
================================================================================================================================
================================================================================================================================
================================================================================================================================

二、视图


视图是一种虚拟的表,是从数据库中的一个或者多个表中导出来的表。

视图还可以从已经存在的视图的基础上定义。

数据库中只存放了视图的定义,并没有存放视图中的数据,这些数据存放在原来的表中。

使用视图查询数据时,数据库会从原来的表中取出对应的数据,因此,视图中的数据是依赖于原来的表中的数据。

一旦原表中的数据发生改变,则显示在视图中的数据也会发生改变。



视图的作用:视图是在原有的表或者视图的基础上重新定义的虚拟表,这样可以从原有的表中选取对用户有用的信息。


1、创建视图

视图可以建立在一张表上,也可以建立在多张表上

语法格式:
           create [ algorithm = { undefined | merge | temptable} ]

                  view 视图名 [(属性清单)]

                  as select 语句

                  [ with { cascaded | loocal } check option ];


algorithm是可选参数,表示视图选择的算法



视图名参数表示需要创建的视图的名称;

属性清单参数是可选参数,其指定了视图中各个属性的名词;默认情况下,与select语句中查询的属性相同;

select语句参数是一个完整的查询语句,表示从某个表中查询出满足条件的记录,并将这些记录导入视图中;

with check option是可选参数,表示更新视图时,要保证在该视图的权限范围内;



cascaded是可选参数,表示更新视图时,要满足所有相关视图和表的条件,该参数为默认值;

local表示更新视图时,只要满足该视图本身的定义条件即可;


(1)在单表上创建视图

举例1: create view department_view1 as select * from department

查询department_view1视图的表结构:desc department_view1;

注释:视图department_view1表的属性与department表的属性完全一样,因为在未指定定义视图的属性列表的情况下,

      视图的属性名与select语句查询的属性名相同。


举例2:create view department_view2(name,fuction,location) as select d_name,fuction,address from department;

视图department_view2的属性列名分别为:name,fuction,location。因为在创建视图时,指定了属性列表。

视图的属性名与属性列表中的属性名相同。



(2)在多表上创建视图


举例:create algorithm=merge view worker_view1 (name,department,sex,age,address) 

      as select name,department.d_name,sex,2009-birthday,address

      from worker,department where worker.d_id=departmnet.d_id

      with local check option;




2、查看视图

(1)describe语句查看视图基本信息

语法格式:describe 视图名;         可以简写为:desc 视图名;

此语句可以简单了解视图中的各个字段的简单的信息


(2)show table status语句查看视图基本信息

语法格式:show table status like '视图名';

like表示后面匹配的是字符串;

视图名参数指需要查看的视图的名称,需要用单引号引起了;



(3)show create view语句查看视图详细信息

语法格式:show create view 视图名;


(4)在views表中查看视图详细信息

在MYSQL中,所有视图的定义都存储在information_schema数据库下的views表中。

查询views表,可以查看到数据库中所有视图的详细信息。

语法格式:select *  from information_schema.views;







3、修改视图

修改视图是指修改数据库中已经存在的表的定义。

当基本表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间的一致;

(1)create or replace view语句修改视图

语法格式:
           create or replace [ algorithm = { undefined | merge | temptable} ]

                      view 视图名 [(属性清单)]

                      as select 语句

                     [ with { cascaded | loocal } check option ];



(2)alter语句修改视图


语法格式:
           alter [ algorithm = { undefined | merge | temptable} ]

                  view 视图名 [(属性清单)]

                  as select 语句

                  [ with { cascaded | loocal } check option ];


4、更新视图

***************************************************


5、删除视图


删除视图是指删除数据库中已经存在的视图的定义;删除视图时,只能删除视图的定义,不会删除数据

语法格式:drop view [if exists] 视图名列表;

if exists参数指判断视图是否存在,如果存在则执行,否则不执行,

视图名列表参数表示要删除的视图的名称列表,各个视图名称之间用逗号隔开;

====================================================================================================================================

create table employee ( num int(50),
                        d_id int(50),
                        name varchar(50),
                        age int(50),
                        sex varchar(50),
                        homeadd varchar(50)
                       );

insert into employee values(1,1001,'zhangsan',26,'nan','beijing');
insert into employee values(2,1001,'lisi',24,'nv','hunan');
insert into employee values(3,1002,'wangwu',25,'nan','jiangsu');
insert into employee values(4,1004,'aric',15,'nan','yingguo');

select * from employee;

create table department ( d_id int(50),
                          d_name varchar(50),
                          functione varchar(50),
                          address varchar(50)
                        );

insert into department values(1001,'keyanbu','yanfachanpin','3lou5hao');
insert into department values(1002,'shengchanbu','shengchanchanp','5louyiceng');
insert into department values(1003,'xiaoshoubu','cehuaxiaoshou','1louxiaoshoudating');

select * from department;


===================================================================================================
select * from employee;

select * from department;


/*在单表上创建视图*/

create view department_view1 as select * from department;

desc department_view1;

select * from department_view1;

select d_id,d_name,functione from department_view1;

==============================================================

create view department_view2(name2,functione2,location2) as select d_name,functione,address from department;

desc department_view2;

select * from department_view2;

===============================================================================
在多表上创建视图

create view department_view3(d_id,name,age,sex,homeadd,bmmc,gongn,bangonglouceng) as 
select employee.d_id,employee.name,employee.age,employee.sex,employee.homeadd,department.d_name,department.functione,department.address 
from employee,department where employee.d_id = department.d_id; select * from department_view3; describe department_view3; ================================================================================================================================ 查看视图 describe 视图名称; 或者 desc 视图名称; =================================================================== 查看视图基本信息 show table status like '视图名'; show table status like 'department_view1'; ======================================================= 查看视图详细信息 show create view 视图名; show create view department_view1; ============================================================== 在views表中查看视图详细信息 select * from information_schema.views; ====================================================================== 修改视图 使用 create or replace 语句,后面的语法格式都一样。 在视图已经存在的情况下,可以对视图进行修改; 在视图不存在的情况下,可以创建视图 select * from department_view2; create or replace view department_view2(id,name2,functione2,location2) as select d_id,d_name,functione,address from department; desc department_view2; select * from department_view2; 使用alter语句也可以修改视图,后面其它语法格式一样; select * from department_view2; alter view department_view2(functione2,location2) as select functione,address from department; desc department_view2; select * from department_view2; ======================================================================================================== 更新视图,即更新原始表格中的数据,但是只能在权利范围之内,一般不建议使用。 ====================================================================================================== 删除视图 drop view [if exists] 视图名列表 [ restrict| cascade ] if exists 指判断视图是否存在,如果存在则执行,不存在,则不需要执行; 视图名称列表 即表示要删除的视图的名称的列表,各个视图名称之间用逗号隔开; drop view department_view1,department_view2,department_view3; ===================================================================================================================== ===================================================================================================================== ===================================================================================================================== ===================================================================================================================== ===================================================================================================================== ===================================================================================================================== 一、索引 索引由数据库表中一列或者多列组合而成,其作用是提高对表中数据的查询速度。 索引是创建在表上面的,是对数据表中一列或者多列的值进行排序的一种结构。 通过索引,查询数据时可以不必读完记录的所有信息,而只是查询索引列。 索引优点:提高检索数据的速度; 索引缺点:创建和维护索引需要耗费时间,耗费时间的数量随着数据量的增加而增加;索引需要占用物理空间,每一个索引要占一定的物理空间, 增加、删除、修改数据时,要动态的维护索引,造成数据的维护速度降低了。 注意:索引可以提高查询速度,但是会影响插入记录的速度。向有索引的表中插入记录时,数据库会按照索引进行排序,这样就降低了插入记录的速度, 插入大量记录时的速度影响更加明显。这种情况下,最好的办法是先删除表中的索引,然后再插入数据。插入完成后,再创建索引。 索引的分类 1、普通索引 2、唯一性索引 3、全文索引 4、单列索引 5、多列索引 6、空间索引 ================================================================================================== 索引的设计原则 1、选择唯一性索引 2、为经常需要排序、分组和联合操作的字段建立索引 3、为常作为查询条件的字段建立索引 4、限制索引的数目 5、尽量使用数据量少的索引 6、尽量使用前缀索引 7、删除不再使用或者很少使用的索引 =========================================================================================================== 创建索引 一、创建表的时候创建索引 语法格式如下: create table 表名 ( 属性名 数据类型 [完整性约束条件], 属性名 数据类型 [完整性约束条件], …… 属性名 数据类型 [unique | fulltext | spatial] index | key [ 别名 ] ( 属性名1 [(长度)]) [ asc | desc ] ) ); unique是可选参数,表示索引为唯一性索引; fulltext是可选参数,表示索引为全文索引; spatial是可选参数,表示索引为空间索引; index 和 key参数用来指定字段为索引的,两者选择其中之一就可以了,作用是一样的; “别名”是可选参数,用来给创建的索引取的新的名称; “属性1”参数指定索引对应的字段的名称,该字段必须为前面定义好的字段; “长度”是可选参数,其指索引的长度,必须是字符串类型才可以使用; “asc”和“desc”都是可选参数,“asc”表示升序排序,“desc”表示降序排序; 1、创建普通索引 创建一个普通索引,不需要加任何unique、fulltext、spatial参数。 示例: create table index1 ( id int, name varchar(20), sex varchar(20), index index1_id (id) ); show create table index1; explain select * from index1 where id = 1; /*possible_keys:index1_id;kye:index1_id ;说明索引被引用了*/ 2、创建唯一性索引 创建唯一性索引时,需要使用unique参数进行约束。 示例:创建一个表名为index2的表,表中的id字段上建立名为index2_id的唯一性索引,且以升序的形式排列。 create table index2 ( id int, name varchar(20), sex varchar(20), unique index index2_id (id asc) ); show create table index2; 3、创建全文索引 全文索引,只能创建在char、varchar、text类型的字段上,而且只有myisam存储引擎支持全文索引。 create table index3 ( id int, info varchar(20), fulltext index index3_info ( info ) )engine=myisam; show create table index3; 4、创建单列索引 单列索引是在表的某一个字段上创建索引 subject字段的长度为20,而index4_st索引的长度只有10,这样做的目的是为了提高查询速度。 对于字符型的数据,可以不用查询全部信息,而只查询前面的若干字符信息。 create table index4 ( id int, subject varchar(30), index index4_st ( subject(10) ) ); show create table index4; 5、创建多列索引 创建多列索引是在表的多个字段上创建一个索引 create table index5 ( id int, name varchar(30), sex varchar(4), index index5_ns ( name,sex ) ); show create table index5; 可以看出,name和sex字段上已经建立了一个名为index5_ns的单列索引。 多列索引里,只有查询条件使用了这些字段中的第一个字段时,索引才会被使用; 如果没有使用索引中的第一个字段,那么这个多列索引就不会起作用。 6、创建空间索引 创建空间索引时,必须使用spatial参数来设置。而且,创建空间索引时,表的存储引擎必须是myisam类型。而且,索引字段必须有非空约束。 create table index6 ( id int, space geometry not null, spatial index index6_sp ( space ) )engine=myisam; show create table index6; 注意:space字段必须是非空的,而且数据类型是geometry类型。这个类型是空间数据类型。空间数据类型包括:geometry、point、linestring、polygon类型等 ======================================================================================================================================= 二、在已经存在的表上创建索引 在已经存在的表中,可以直接为表上的一个或几个字段创建索引。格式如下: create [unique | fulltext | spatial] index 索引名 on 表名 ( 属性名 [(长度)]) [ asc | desc ] ); unique是可选参数,表示索引为唯一性索引; fulltext是可选参数,表示索引为全文索引; spatial是可选参数,表示索引为空间索引; index 用来指定字段为索引的; “索引名”参数是给创建的索引取的新名称; “表名”是指需要创建索引的表的名称,该表必须是已经存在的,如果不存在,需要先创建; “属性名”参数指定索引对应的字段的名称,该字段必须为前面定义好的字段; “长度”是可选参数,其指索引的长度,必须是字符串类型才可以使用; “asc”和“desc”都是可选参数,“asc”表示升序排序,“desc”表示降序排序; 1、创建普通索引 create table example0 ( id int, name varchar(20), sex varchar(40) ); show create table example0; create index index7_id on example0( id ); 2、创建唯一性索引 create unique index index8_id on index8( course_id ); 3、创建全文索引 create fulltext index index9_info on index9( info ); 4、创建单列索引 create index index10_addr on index10 ( address(4) ); 5、创建多列索引 create index index11_na on index11 ( name , address ); 6、创建空间索引 create spatial index index12_line on index12( line ); ================================================================================================== 三、用alter table语句来创建索引 在已经存在的表上,可以通过alter table语句直接为表上的一个或几个字段创建索引 语法格式如下: alter table 表名 add [unique | fulltext | spatial] index 索引名 ( 属性名 [(长度)]) [ asc | desc ] ); 1、创建普通索引 alter table example0 add index index13_name ( name ); 2、创建唯一性索引 alter table index14 add unique index index14_id ( course_id ); 3、创建全文索引 alter table index15 add fulltext index index15_info( info ); 4、创建单列索引 alter table index16 add index index16_addr( address(4) ); 5、创建多列索引 alter table index17 add index index17_na( name,address ); 6、创建空间索引 alter table index18 add spatial index index18_line( line ); ==================================================================================================================== 删除索引 指将表中已经存在的索引删除掉。 语法格式如下: drop index 索引名 on 表名; ========================================================================================================================
posted @ 2019-12-25 15:49  小白龙白龙马  阅读(246)  评论(0编辑  收藏  举报