安装mysql
参考文档
其实mysql是我第一个安装的软件,数字1和字母l让我吃尽了苦头。还有很多字母拼写总是或拼写错。后来还是没办法,用ssl链接系统。通过网页粘贴命令。
use database
创建数据表
信息数据录入表
create table mqttmes(
MS_id int not null primary key auto_increment comment’主键键’,
YG_id int not null ,
GD_id int not null,
GX_id int not null,
Up_time timestamp not null,
JG_shuliang int not null);
工序表
create table GX_list(
GX_id int not null primary key auto_increment comment’工序ID’,
GX_Mes char(20) );
工单表
create table GD_list(
GD_id int not null primary key auto_increment comment’工序ID’,
GX_1 int default 0,
GX_2 int default 0,
GX_3 int default 0,
GX_4 int default 0,
ZSH int not null);
员工表
create table YG_id(
YG_id int not null primary key auto_increment comment’员工ID’,
name char(20) not null,
sex int,
great char(20),
Msg char(200));
增加测试数据
员工表
insert into YG_id(name) values(‘1’);
insert into YG_id(name) values(‘2’);
insert into YG_id(name) values(‘3’);
insert into YG_id(name) values(‘4’);
insert into YG_id(name) values(‘a1’);
insert into YG_id(name) values(‘a2’);
insert into YG_id(name) values(‘a3’);
insert into YG_id(name) values(‘a4’);
insert into YG_id(name) values(‘b1’);
insert into YG_id(name) values(‘b2’);
insert into YG_id(name) values(‘b3’);
insert into YG_id(name) values(‘b4’);
select * from YG_id;
工单表
insert into GD_list(ZSH) values(100);
select * from GD_list;
信息表
insert into mqttmes(YG_id ,GD_id,GX_id, Up_time, JG_shuliang) values(1,3,4,now(),50);
select * from mqttmes;
增加触发函数
测试SQL update
update GD_list set GX_1=GX_1+2 where GD_id=1;
增加触发器
create trigger auto_total after insert on mqttmes for each row update GD_list set GX_1=GX_1+2 where GD_id=1;
增加加数据测试触发器效果
mysql> select * from GD_list;
±------±-----±-----±-----±-----±----+
| GD_id | GX_1 | GX_2 | GX_3 | GX_4 | ZSH |
±------±-----±-----±-----±-----±----+
| 1 | 8 | 0 | 0 | 0 | 100 |
| 2 | 2 | 0 | 0 | 0 | 200 |
| 3 | 2 | 0 | 0 | 0 | 500 |
±------±-----±-----±-----±-----±----+
3 rows in set (0.00 sec)
mysql> insert into mqttmes(YG_id ,GD_id,GX_id, Up_time, JG_shuliang) values(1,3,4,now(),50);
Query OK, 1 row affected (0.00 sec)
mysql> select * from GD_list;
±------±-----±-----±-----±-----±----+
| GD_id | GX_1 | GX_2 | GX_3 | GX_4 | ZSH |
±------±-----±-----±-----±-----±----+
| 1 | 10 | 0 | 0 | 0 | 100 |
| 2 | 2 | 0 | 0 | 0 | 200 |
| 3 | 2 | 0 | 0 | 0 | 500 |
±------±-----±-----±-----±-----±----+
3 rows in set (0.00 sec)
触发器正常可以运行
修改触发器,增加变量,
尝试改用存储过程
delimiter
C
R
E
A
T
E
P
R
O
C
E
D
U
R
E
t
o
t
a
l
G
X
a
m
o
u
n
t
(
I
N
p
r
Y
G
i
d
i
n
t
,
I
N
p
r
G
D
i
d
i
n
t
,
I
N
p
r
J
G
s
h
u
l
i
a
n
g
i
n
t
)
B
E
G
I
N
u
p
d
a
t
e
G
D
l
i
s
t
s
e
t
G
X
1
=
G
X
1
+
p
r
J
G
s
h
u
l
i
a
n
g
w
h
e
r
e
G
D
i
d
=
p
r
G
D
i
d
;
i
n
s
e
r
t
i
n
t
o
m
q
t
t
m
e
s
(
Y
G
i
d
,
G
D
i
d
,
G
X
i
d
,
U
p
t
i
m
e
,
J
G
s
h
u
l
i
a
n
g
)
v
a
l
u
e
s
(
p
r
Y
G
i
d
,
1
,
p
r
G
D
i
d
,
4
,
n
o
w
(
)
,
p
r
J
G
s
h
u
l
i
a
n
g
)
;
E
N
D
CREATE PROCEDURE total_GX_amount(IN pr_YG_id int,IN pr_GD_id int,IN pr_JG_shuliang int) BEGIN update GD_list set GX_1=GX_1+pr_JG_shuliang where GD_id=pr_GD_id; insert into mqttmes(YG_id ,GD_id,GX_id, Up_time, JG_shuliang) values(pr_YG_id,1,pr_GD_id,4,now(),pr_JG_shuliang); END
CREATEPROCEDUREtotalGXamount(INprYGidint,INprGDidint,INprJGshuliangint)BEGINupdateGDlistsetGX1=GX1+prJGshuliangwhereGDid=prGDid;insertintomqttmes(YGid,GDid,GXid,Uptime,JGshuliang)values(prYGid,1,prGDid,4,now(),prJGshuliang);END
delimiter ;
在存储过程中使用变量作为字段名。
参考
CREATE DEFINER=root
@localhost
PROCEDURE total_GX_amount
(IN pr_YG_id int,IN pr_GD_id int,IN pr_GX_id VARCHAR(30),IN pr_JG_shuliang int)
BEGIN
SET @sqlStr:=CONCAT(“update GD_list set “,pr_GX_id,”=”,pr_GX_id,"+",pr_JG_shuliang," where GD_list.GD_id=",pr_GD_id);
SELECT @sqlStr;
PREPARE stmt from @sqlStr;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
CONCAT可以用字符串拼接一个sql语句
再次回到触发器
在存储过程中已经找到解决办法。
因为需要频繁的测试存储过程我装了一个图形mysql管理工具。发现触发器的也可以很好的在图形管理工具中进行调试。
参考
所以我有再次回到了触发器上进行。设计,这次我已经掌握new代表新更新的一条记录。比如new.id表示刚更新表的记录中id字段的数据。
我先做了一个小测试
在图形界面编辑 和编写和测试效率很高。还是用图形新界面的吧。
定义变量
参考
声明变量v_employee_name和v_employee_salary,通过SELECT…INTO语句查询指定记录并为变量赋值:
DECLARE v_employee_name VARCHAR(100);
DECLARE v_employee_salary DECIMAL(8,4);
SELECT employee_name, employee_salary
INTO v_employee_name, v_employee_salary
FROM employees
————————————————
版权声明:本文为CSDN博主「davide_tian」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jssg_tzw/article/details/39703889
csdn以为的链接
https://www.runoob.com/w3cnote/mysql-stored-procedure.html
触发器不支持动态sql
即使调用还有动态qsl的存储函数也不行,
存储过程可以支持动态函数
我计划使用“降维打击”的办法,把需要的动态字段用枚举的形式,放到一个表的一个字段的里。这样会增加表的数量,取的时候只要GROUP一下就可以了。