一、触发器 触发器是由事件来出发某个动作。这些事件包括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 表名; ========================================================================================================================