11.外键,存储过程

数据库之外键

==========================、

一、外键的介绍

1、外键的定义

让一张表记录的数据不要太过于冗余,在数据库中对表的关系进行解耦,尽量让表的数据单一化。

2、外键的作用

保持数据的一致性和完整性

3、msyql 数据库中的存储引擎?

myisam (默认)

innodb (外键需要用到innodb存储格式)

4、查看存储引擎

格式:show table status from 库名 where name='表名' ;

案例:show table status from hz017 where name='student2' ;

5、存储类型:myisam (默认)

5、查看外键方法:

(1)在navicat中查看

(2)

格式:show create table 表名;

案例:show create table cc

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

二、外键运用

(一)建表时创建外键

(1)创建 engine=INNODB 格式

格式:
REFERENCES 父表(父表字段)) engine=INNODB ;
CREATE table 表名 (字段名 字段类型(字符长度) PRIMARY key , 字段名 字符类型(字符长度) ,constraint 外键名 FOREIGN key(子表字段);

案例:

父表

create table ss (id int(10) PRIMARY key, name varchar(20) )ENGINE=INNODB ;

子表

CREATE table cc (cid int(10) PRIMARY key ,cname VARCHAR(20) ,constraint wj FOREIGN key(cid)
REFERENCES ss(id)) engine=INNODB ;

constraint 外键 名 (指定外键名)

FOREIGN key 子表字段 指定的字段

REFERENCES 父表(父表字段) 引用外部表的主键

(二)建表以后再添加外键

格式:

alter TABLE 子表 add CONSTRAINT 外建名 FOREIGN key (子表字段) REFERENCES 父表(父表字段)

(1)新建两个表

父表

create table xx (id int(10) PRIMARY key ,name varchar(20))engine=INNODB ;

子表

create table yy (yid int(10) PRIMARY key ,yame varchar(20))engine=INNODB ;

select * from xx ;
SELECT * from yy;
show create table yy;

alter TABLE yy add CONSTRAINT wjm FOREIGN key (yid) REFERENCES xx(id)

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

删除外键:

格式:ALTER TABLE 表名 drop foreign key 外键名;

案例:ALTER TABLE yy drop foreign key wjm ;

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

外键特点:

外键实际操作:

1、当父表不存在的数据,子表也无法插入数据(子表无法插入数据)

2、父表中存在的数据,子表就可以插入数据(插入数据)

3、删除数据,子表中存在的数据,直接删除父表是无法删除 (要先删除子表数据,在删除父表数据)

4、删除父表的数据,先删除子表,在删除父表

{{uploading-image-539099.png(uploading...)}}

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

面试题:

1、什么是外键?

2、外键作用?

3、如何创建外键?

4、如何删除外键

5、公司中为什么使用外键?

(1)保存数据的一致性和完整性

(2)公司数据量大,造成数据重复,新旧表维护成本大,使用外键让公司数据进行分类和管理,让基础数据放在主表,子表单一化,避免数据的冗余

存储过程

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

一、存储过程介绍

1、什么是存储过程?

存储过程是实现某个特点功能的sql语句的集合,编译后的存储过程会保存在数据中,通过存储过程的名称反复的调用执行。

2、存储过程的优点?

t(1)存储过程创建后,就可以反复的调用和使用,不需要重新写复杂的语句

(2)创建,修改存储过程不会对数据有任何的影响

(3)存储过程可以通过输入参数返回输出值

(4)通过存储过程中加入控制语句,可以加强sql语句的功能性和灵活性

(5)对于单个l语句增删改查,可以直接封装一个集合中,存储过程一旦创建就可以直接调用,且可可以重复调用

(6)单个sql语句每一次执行都需要对数据进行编译,而存储过程被创建只需要编译一次,后续即可调用

(7)创建的存储过程,可以重复进行调用,可以减少数据库开发人员的工作量

(8)防止sql 注入

(9)造数据(重点)

3、mysql5.0版本之后就支持存储过程,存储过程是由sql语句和控制语句组成的

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

格式:

delimiter // #分隔符 符号 //
create PROCEDURE 存储名( 参数名:in out inout)
BEGIN 开始
sql语句 执行语句
END 结束

// 分隔符号

call 存储名(参数) 调用一个存储过程

案例:

delimiter //
create PROCEDURE hz001()
BEGIN
SELECT * from emp ;
select * from dept ;
END

//

call hz001()

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

三、存储过程的基本语句:

(1) 删除存储过程

格式:

drop procedure 存储名称

案例:

drop procedure hz001

(2)查看单个存储过程的详情

格式:

show create procedure 存储过程;

案例:

show create procedure hz001;

(3)查看所有已经建好的存储过程详情

格式:show procedure status

(4)查询指定数据库里创建的存储过程

格式:

show procedure status where db="数据库名"

案例:show procedure status where db="hz017"

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

四、创建存储

1、创建无参数存储过程

格式:

delimiter //
create PROCEDURE 存储名1() #无参数,是括号内无参数
BEGIN #开始
sql语句 #执行语句
END #结束

// 结束符号

call 存储名() 调用存储名称

案例:

delimiter //
create PROCEDURE hz1() #无参数,是括号内无参数
BEGIN
SELECT * from emp where dept2=101 ;
END

//

call hz1()


2、带有in参数的存储

in表示输入数据

格式:

delimiter //
create PROCEDURE 存储名(in x int ) #in参数,是括号
BEGIN
sql语句
END

//

call 存储过程(入参)

案例:

delimiter //
create PROCEDURE hz(in x int ) #无参数,是括号内无参数
BEGIN
SELECT * from emp where dept2=x ;
END

//

call hz(105)


3、带out 的参数(输出参数)

格式:

delimiter //
create PROCEDURE 存储名(out x int ) #in参数,是括号
BEGIN
sql语句
END

//

call 存储过程(入参)

案例:

delimiter //
create PROCEDURE hz5(out y int ) #无参数,是括号内无参数
BEGIN
SELECT age into y from emp where dept2=105;
END

//

call hz5(@y)
select @y


带有 in 和out 的存储过程

案例:

delimiter //
create PROCEDURE hz6(in x int ,out y int ) #无参数,是括号内无参数
BEGIN
SELECT age into y from emp where dept2=x;
END

//

call hz6(109,@y)
select @y

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

inout参数 代表着输入和输出

案例1:

delimiter //
create PROCEDURE hz8(inout m int ) #无参数,是括号内无参数
BEGIN
set m=m+1;
END
//
set @m=2
call hz8(@m)
select @m


案例2:

delimiter //
create PROCEDURE hz9(inout x int ) #无参数,是括号内无参数
BEGIN
SELECT age into x from emp where dept2=x;
END

//

set @x=109
call hz8(@x)
select @x

备注:

CHARACTER set UTF8 解决?号

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

posted @ 2024-07-23 11:24  藕丝鲜芋  阅读(9)  评论(0编辑  收藏  举报