找回密码
 立即注册

推荐阅读

  • 便民服务
  • 关注我们
  • 社区新手
11.28外键约束
外键的作用:保持数据的一致性,完整性
创建外键关联表和表:primary key主键
engine=innodb ----外键约束   创建外键或者事务的时候
主表和子表
如:create table dcs1(id int(1)primary key,name char(2) engine=innodb) 主表,意思是我创建了dcs1这个表,然后给id加了主键,给表创建了一个外键,作为主表
基于主表来创建子表(子表关联主表):
创建子表dcs2子表的时候,创建外键
dcs2表,里面包含sid,name 然后建立外键:
如:create table dcs2(sid int(3)primary key,sname char(10),CONSTRAINT aa FOREIGN  key(sid)REFERENCES dcs1(id))ENGINE=INNODB
constraint aa 这个语法作用是用来定义外键名称,后续删除外键可以通过删除这个名称来解除
(constraint 外键名称为aa的意思)
foreign  key(sid)设置外键约束:dcs2中的sid
references dcs1(id)) 和dcs1中的id关联,dcs1为主,dcs2为子表, 外部的键参考于dcs1(id)
engine=innodb  驱动的等于innodb外键
如:创建主表:create table dcs1(id int(1)prymary key,name char(4)) engine=innodb;
       创建子表:create table dcs2(sid int(1)primary key, age int(4),constraint aa foreign key(sid)references dcs1(id) ) engine=innodb
   

当前创建后:dcs1和dcs2是外键关系,其中dcs1是主表,dcs2是子表
注意:1、主表中有数据,子表才能拥有数据
           2、主表中有多少行的数据,子表才能有对应行数不能超过主表的数据
           3、如果你要删除主表的数据,必须要先删除子表的数据
           4、如果你要删除主表,必须要删除子表

删除:alter table 子表名 drop foreign key 外键名
如:  alter table dcs2 drop foreign key aa
   

   

数据库视图:view
保护基本表的敏感信息,如:只提取需要看的,其他敏感信息就不提取
表和视图数据互相影响,对任意一方的数据内容的增删改都会影响到对方
视图的作用:
   
create view yy as (select id,name from dcs) 我创建一个新的视图名字叫yy,表来自于dcs,并且取的是id,name的字段数据
如:create view yy as (select * from oym)   视图也相当于copy,查看就直接desc yy就行
show create view yy 查看这个yy的视图
show tables 也可以看到视图
drop view yy 删除yy这个视图

   

存储过程
存储过程:创建大量的测试数据,用这个数据进行相关的测试
                  简称:造数据
使用频率对于测试岗位不是很高,开发用得比较多
一个存储代码写好后可以给其他同事调用
如:1000个订单用户,如果用insert into 一条一条太麻烦,直接传一个参数:1000 执行
第一:了解存储的脚本架构
create procedure 存储名 ()                按
begin  开始                                        顺
   代码块                                            序
end   结束                                          执
call(存储名)                                   行
如:create procedure dcs()   创建一个存储名称是dcs
begin  开始
end   结束
call(dcs)  调用dcs这个存储(这个命令和上面是分开的,只有调用的时候才会用)
第二:写一个实例
create procedure dcs()
begin 开始
create table duoceshi(id int(4)primary key,score int(4));
insert into duoceshi(id,score)values(1,22),(2,33),(3,44);
select * from duoceshi
end
   
end 结束
call dcs() ; 调用
   
二次调用的时候出现异常,以上写法只能被调用一次,因为已经存在的表格不能再次调用
   
第三:解决限制只能调用执行一次,增强代码的容错率和健壮性
如:按以下顺序进行操作
drop procedure if exists dcs;  增强代码的容错率和健壮性
create procedure dcs()  
begin  开始
drop table if exists duoceshi ; (当它存在就删除,不存在就不异常,正常建立)
create table duoceshi(id int(4)primary key,score int(4));
insert into duoceshi(id,score)values(1,22),(2,33),(3,44);
select * from duoceshi
end
   
第四:了解形参和实参,还有做增删改的相关操作
drop procedure if exists dcs;
create procedure dcs()  创建存储
begin 开始
drop table if exists duoceshi;
create table duoceshi(id int(4)primary key,score int(4));
insert into duoceshi(id,score)values(1,22),(2,33),(3,44);
select * from duoceshi;  如果要显示某个字段或数据,就select scroe from duoceshi where id=1  代码就得重新运行才能调用 ,如果要修改updete和删除delete都需要重新运行
end 结束
call dcs();
形参:create procedure dcs(aa int)  给这个存储做了个形参叫aa 类型是整型int
调用的时候一定要给这个形参赋予实参
如:select * from duoceshi where id=aa;
赋予实参  call dcs(2)  意思是调用dcs的形参aa,但是因为是id=2,然后写在call dcs(2)括号里,代表id=2,给形参aa,赋予了实参2
如:
drop procedure if exists dcs;
create procedure dcs(aa int)
begin
create table duoceshi(id int(4)primary key,score int(4));
insert into duoceshi(id,score)values(1,22),(2,33),(3,44);
select * from duoceshi where id=aa;
end
call dcs(2);
形参是设定在dcs存储中的,那么通过call 调用的时候一定要赋予一个对应的形参对应的实参,且只能赋予1个值
   

第五:if 的判断 (第二个月常用)
drop procedure if exists dcs;
create procedure dcs(n int)  创建存储
begin 开始
drop table if exists duoceshi;
create table duoceshi(id int(4)primary key,score int(4));
insert into duoceshi(id,score)values(1,22),(2,33),(3,44);
if n=0 then 形参等于0 如果条件满足则执行查询所有
   select * from duoceshi;
else 不满足if的话,否则就运行
   select min(score) from duoceshi;不满足则查询求分数最小
end if; 结束if判断
end
call dcs(1)(为0就满足上面那个if
完整的if案例
drop procedure if exists dcs;
create procedure dcs(n int)
begin
drop table if exists duoceshi;
create table duoceshi(id int(4)primary key,score int(4));  
insert into duoceshi(id,score)values(1,22),(2,33),(3,44);
if n=1 then
  select * from duoceshi;  (* 号可以显示对应的字段)
  else
  select min(score)from duoceshi;
end if;
end
call dcs(2);(不满足if,所以出现else下面的min,如果是1就会满足if,就会出现if面的全部)
   
第六:if 的多分支判断
drop procedure if exists dcs;
create procedure dcs(n int)  创建存储
begin 开始
drop table if exists duoceshi;
create table duoceshi(id int(4)primary key,score int(4));
insert into duoceshi(id,score)values(1,22),(2,33),(3,44);
select * from duoceshi;
if n=0 then 形参等于0 如果条件满足则执行查询所有
   select * from duoceshi;
else if n >1 then   不满足则查询
   select * from duoceshi where id=3;
else
select min(score) from duoceshi;
end if; 结束if判断
end
call dcs(1)

第七;设置变量和while循环语句
drop procedure if exists dcs;
create procedure dcs(n int)  创建存储
begin 开始
declare i int default 1; 设置一个变量i,整型给变量赋予值1 就是i=1
declare j int default(select min(score) from duoceshi); (也可以这样创建变量)
drop table if exists duoceshi;
create table duoceshi(id int(4)primary key auto_increment,score int(4));
while n>i do   (while 当n大于i的时候,条件满足进入循环 while循环如果条件满足进入循环体,不满足退出循环体,一直满足一直循环(死循环)
insert into duoceshi(score)values(i);
set i=i+1 (i等于+1,永远大一个)
end while;

select * from duoceshi;
end

案例死循环
drop procedure if exists dcs;
create procedure dcs(n int)  创建存储
begin 开始
declare i int default 1; 设置一个变量i,整型给变量赋予值1 就是i=1
declare j int default(select min(score) from duoceshi); (也可以这样创建变量)
drop table if exists duoceshi;
create table duoceshi(id int(4)primary key auto_increment,score int(4));
while n>=i do n=2,i=1, (while 当n大于i的时候,条件满足进入循环 while循环如果条件满足进入循环体,不满足退出循环体,一直满足一直循环(死循环)
insert into duoceshi(score)values(i);
end while;

select * from duoceshi;
end
call dcs(2)
死循环完整正确代码
drop procedure if exists dcs;
create procedure dcs(n int)
begin
declare i int default 1;
drop table if exists duoceshi;
create table duoceshi(id int(4)primary key auto_increment,score int(4));
while n>=i do
insert into duoceshi(score)values(i);
  end while;
select * from duoceshi;
end
call dcs(2);
   
不是死循环案例,正常循环
drop procedure if exists dcs;
create procedure dcs(n int)  创建存储
begin 开始
declare i int default 1; 设置一个变量i,整型给变量赋予值1 就是i=1
declare j int default(select min(score) from duoceshi); (也可以这样创建变量)
drop table if exists duoceshi;
create table duoceshi(id int(4)primary key auto_increment,score int(4));
while n>i do n=10,i=1, (while 当n大于i的时候,条件满足进入循环 while循环如果条件满足进入循环体,不满足退出循环体,一直满足一直循环(死循环)
insert into duoceshi(score)values(i);
set i=i+1 (i拥有加1,n=10,i=i+1,循环10次后,i也加了10次,大于n的10了,就会结束死循环)
end while;

select * from duoceshi;
end
call dcs(10);
   
不是死循环的代码
drop procedure if exists dcs;
create procedure dcs(n int)
begin
declare i int default 1;
drop table if exists duoceshi;
create table duoceshi(id int(4)primary key auto_increment,score int(4));
while n>=i do
insert into duoceshi(score)values(i);
set i=i+1;
  end while;
select * from duoceshi;
end
call dcs(6);

分享至 : QQ空间
收藏

0 个回复

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