请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册
(一)索引 -- index
是一种数据结构,可以有效提高数据的查询速度(类似于书本的目录) 主要是添加在一些频繁被查询的数据字段上面。在大量数据的前提下,添加索引查询数据才是有效率的。添加索引是针对性的,如果每个字段都要添加索引,反而会消耗大量的系统资源,但是添加索引之后也会影响数据插入或者数据更新的速度

索引分类有3种:
(1)主键索引 primary key (PRI):一个表中只能存在一个主键索引,要求对应字段的值 唯一且不能为空
(2)普通索引 index (MUL):表中是可以存在多个普通索引,对索引字段的值是没有要求的
(3)唯一索引 unique index (UNI):表中是可以存在多个普通索引,对索引字段的值是不能重复,内容可以为空

索引的优先级:PRI >UNI>MUL

创建普通索引--index (MUL)
(1)使用create index 语句创建索引
给单个字段创建普通索引
create index aa on emp(name); -- 创建索引 aa 在 emp表中 name字段上
show index from emp; -- 展示索引 来自于 emp表 == 查看emp表的索引情况

给多个字段创建普通索引 -- 复合索引
create index bb on emp(age,incoming); -- 创建索引 bb 在 emp表中 age 和 incoming 字段上
删除索引:
alter table emp drop index bb; -- 修改 emp表 丢弃索引 bb

(2)通过alter table的方式创建索引
alter table emp add index bb(age); -- 修改 emp表 添加 索引bb 在age字段上

唯一索引--unique index (UNI)
(1)通过create unique index创建
create unique index cc on emp(incoming); ---创建unique 唯一索引cc 在emp表的incoming字段上

(2)通过alter table创建
alter table emp add unique index ee(worktime_start); ---修改 emp表添加 唯一索引 ee 在worktime_start字段上

删除唯一索引:(删除普通索引是一样的)
alter table emp drop index ee; -- 修改 emp表丢弃索引 ee == 删除emp表上的唯一索引ee
alter table emp drop index aa,drop index ee; -- 同时删除emp表上的多个索引


主键索引 primary key
在创建主键时,主键索引就同时创建成功

(二)视图 --view

是一个虚拟表,只是用来显示数据的,不是存储数据
安全性:有些表格需要对外展示的,可是有些字段是要保密的,那么我们可以创建视图只对某些字段显示
简化查询:在工作的时候,我们查询的可能不是单表,还关联着其它多个表,如果是经常使用的,那么就可以通过创建视图来简化

视图的特点:
1,视图是由实际的表产生的
2,视图的查询本质上是对实绩表进行查询操作,所以使用视图性能相对差
3,视图的创建和删除是不会影响实际的基础表,但是数据是会互相影响
4,当一个视图的数据来源是很复杂sql时,那么视图的数据是不允许修改的

创建视图
create view dcs as(select class,name age from grade); ---创建视图 dcs 根据查询 class,name,age字段的值来源grade表
show create view dcs;-- 查看视图表dcs的结构

基础表和视图的数据修改是可以相互影响的(只能是简单的sql创建的视图表)
update grade set name='张三' where name='zhangsan' --修改实绩表中的数据
drop view dcs;-- 丢弃视图dcs == 删除dcs视图表
show table status where comment='view'; -- 通过sql的方式查看当前库中有哪些视图

(开发或者DBA去操作的)DDL == 数据库定义语音 == 对表的定义,表字段进行操作 == create(创建),alter table(修改表),drop(删除)
(我们平常使用数据库)DML == 数据库操作语音 == 对表中数据进行操作 == 增insertinto ,删 delete ,改update...set... ,查 select

(三)外键 foreign key
约束表与表之间的内容,为了避免一张表的数据太过冗余,那么就要对表进行拆分解耦,防止解耦之后的数据不完整,就要引入外键约束数据的一致性和完整性

举例:创建两张表dcs1和dcs2
(1)把dcs1设计为主表,dcs2设计为从表
creat table dcs1(id int(4) primary key,name varchar(20)) engine=innodb;
-- 创建表dcs1 表里面包含id字段属性为int(4) 主键,name字段属性为varchar(20),数据引擎为innodb
-- 因为mysql普通的建表,数据引擎默认为myism是不支持外键,支持外键约束是innodb

(2)创建dcs2表 -- 从表 ,加上外键,引用dcs1表中id字段
create table dcs2(sid int(4) primary key,sname varchar(20),constraint gz foreign key(sid) references dcs1(id)) engine=innodb;
--   创建表dcs2表里面包含sid字段属性int(4)主键,sname字段属性为varchar(20),创建约束为名称gz,外键定义在sid字段上,引用dcs1表中的id字段,数据引擎为innodb

constraint gz -- 创建约束名称为gz
foreign key(sid) -- 外键定义在sid字段上
references dcs1(id) -- 引用dcs1表中的id字段
当完成上述的建表语句之后,dcs2表中的sid字段的值就被dcs1表中的id字段约束着(当dcs1表中id字段没有x值时,那么dcs2的sid就不能存在x这个值)

(3)往dcs1和dcs2分别插入数据
insert into dcs1 values(1,'xiaomai'),(2,'laomai')
select * from dcs1;
insert into dcs2 values(1,'xxxxx')
select * from dcs2;

(4)程序报错:往dcs2表插入一条主表id字段不存在的数据
insert into dcs2 values(3,'yyyy') -- 报错,因为3是不存在主表的id字段中

(5)把dcs1主表中已经被从表引用的数据进行更新或者修改
update dcs1 set id=4 where name='xiaomai' -- 报错,因为id=1的值被从表的sid引用着
delete from dcs1 where id=1; -- 报错,因为id=1的值被从表sid引用着
delete from dcs2 where sid=1;-- 先把子表中的sid=1的值进行删除,后续就可以删除或者修改主表中对应的值

(6)删除外键,只要对子表进行操作即可,因为外键是定义在子表上的
alter table dcs2 drop foreign key gz; -- 修改表 dcs2表 丢弃外键gz;

结论:当主表中dcs1表中被引用的字段没有x值时,那么从表dcs2的外键约束字段就不能存在x这个值
主表不存在的数据,在与之相关的从表是无法插入对应的数据
1,对从表插入数据时,如果主表没有对应的数据,则无法插入
2,要删除或者修改主表的数据,要先确认主表的数据有没有被引用,如果被引用要先删除从表中对应的数据

分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册