create database exam;
use exam;
-准备三张表 spxxb(商品信息表)kcb(库存表) hzpyb(汉字拼音表)
hzpyb需要导入(有sql文件)
CREATE TABLE spxxb
(
spid
int(11) NOT NULL AUTO_INCREMENT,
spmc
varchar(50) DEFAULT NULL,
sptm
varchar(20) DEFAULT NULL,
jldw
varchar(10) DEFAULT NULL,
spzt
int(11) DEFAULT ‘0’,
lsj
decimal(9,2) DEFAULT NULL,
mcsx
varchar(10) DEFAULT NULL,
PRIMARY KEY (spid
)
);
CREATE TABLE spkcb
(
kcid
int(11) NOT NULL AUTO_INCREMENT,
spid
int(11) DEFAULT NULL,
kcsl
int(11) DEFAULT ‘0’,
PRIMARY KEY (kcid
)
);
商品信息维护
需要实现的功能
spxxb(商品信息表)的新增,修改,删除。
并且在实现三种功能时需要自动维护(如下)
在insert(新增) (1)在spxxb中新增一条记录时,spkcb(商品库存表)需要对应新增一条记录(触发器)(2)需要实现spxxb名称缩写那一列,不需要我们输入,根据名称自动生成(触发器)
update 当spxxb中一行的商品名称更改时,名称缩写自动根据新名称更改(触发器)
delete 当spxxb中删除一条记录时,spkcb中对应的记录自动删除(触发器)
首先需要完成对名称缩写函数的编写(实现输入汉字,输出拼音简写)
delimiter $$
create function `PysxCx`(zw varchar(50)) returns varchar(10) charset utf8mb4
begin
set @pysx='';
set @jp='';
set @l=char_length(zw);
set @i=1;
while(@i<=@l) do
select jp into @jp from hzpyb where hz=substring(zw,@i,1);
set @pysx=concat(@pysx,@jp);
set @i=@i+1;
end while;
return @pysx;
end;$$
delimiter ;
测试
select pysxcx(‘张三’);
结果为zs
接着写总体存储过程
各名称缩写含义
whfs 维护方式 spid 商品id spmc 商品名称 sptm 商品条码 jldw 计量单位 spzt 商品状态 lsj 零售价
维护方式为0 新增,为1修改,其他则删除该记录
desc spxxb;
delimiter $$
create procedure `SpxxWh`(whfs int,spid int,spmc varchar(50),sptm varchar(20),jldw varchar(10),spzt int,lsj decimal(9,2))
begin
if whfs=0 then
insert into spxxb(spmc,sptm,jldw,spzt,lsj) values(spmc,sptm,jldw,spzt,lsj);
elseif whfs=1 then
update spxxb set `spxxb`.`spmc`=spmc,`spxxb`.`sptm`=sptm,`spxxb`.`jldw`=jldw,`spxxb`.`spzt`=spzt,`spxxb`.`lsj`=lsj where `spxxb`.`spid`=spid;
else
delete from spxxb where `spxxb`.`spid`=spid;
end if;
end$$
delimiter;
写一个触发器,当商品信息表插入记录时触发,自动维护(自动根据名称生成名称缩写)名称缩写
delimiter $$
create trigger `Update_spxxb_mcsx_before_insert_spxxb` before insert on `spxxb` for each row
begin
set new.mcsx=pysxcx(new.spmc);
end$$
delimiter ;
写一个触发器当,商品信息表中商品名称更改时,自动维护名称缩写
delimiter $$
create trigger `Update_spxxb_mcsc_before_update_spxxb` before update on `spxxb` for each row
begin
if new.spmc<>old.spmc then
set new.mcsx=pysxcx(new.spmc);
end if;
end$$
delimiter;
测试
call SpxxWh(1,1,‘哇哈哈牛奶’,‘100’,‘瓶’,1,3.88);
hptm货品条码
写一个触发器当商品明细表删除记录时,商品库存表删除相应记录
delimiter$$
create trigger `Update_spkcb_before_delete_spxxb` before delete on `spxxb` for each row
begin
delete from spkcb where spid=old.spid;
end$$
delimiter;
写一个触发器当商品信息表新增时,商品库存表增加相应记录
delimiter $$
create trigger `Update_spkcb_after_insert_spxxb` after insert on `spxxb` for each row
begin
insert into spkcb(spid,kcsl) values(new.spid,0);
end$$
delimiter ;
测试
call SpxxWh(0,6,‘卤蛋’,‘106’,‘个’,1,1.5);