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