加工过程:根据用户需要加工的物品及数量,先查看其材料是否充足.充足时,减去相应的材料,添加一个定时任务加工成品.事务处理由程序控制.
数据表:物品,加工方案,用户物品
mysql> desc TableA; # 物品(包括成品和材料)
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(8) | NO | PRI | NULL | auto_increment |
| name | varchar(64) | YES | | NULL | |
| image | varchar(96) | YES | | NULL | |
+------------+--------------+------+-----+---------+----------------+
mysql> desc TableB; # 成品生成方案 (由材料生成成品,sid,pid 都对应物品表的id)
+---------+--------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------+------+-----+---------+-------+
| sid | int(8) | NO | MUL | NULL | |
| pid | int(8) | YES | | NULL | |
| num | int(8) | YES | | 1 | |
+---------+--------+------+-----+---------+-------+
mysql> desc TableC; # 用户物品 (sid对应物品表的id)
+---------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------+------+-----+---------+-------+
| uid | bigint(20) | NO | PRI | NULL | |
| sid | int(8) | NO | PRI | 1 | |
| amount | int(8) | YES | | 1 | |
+---------+------------+------+-----+---------+-------+
加工过程用mysql存储过程实现.这里只提供如何减去相应的材料. 传入用户id,物品id,生产数量,返回结果.
out result bigint,
in uuid bigint,
in ssid bigint,
in numm int
如何减去相应的材料:
1.错误:只使用于只有一个材料的时候,否则会出现返回多行错误。
update TableC set amount = amount - numm*(select num from (select sid from TableC where uid = uuid ) as a right join (select num,pid from TableB where sid = ssid) as b on a.sid = b.pid) where uid = uuid and sid = (select sid from (select sid from TableC where uid = uuid ) as c right join (select pid from TableB where sid = ssid) as d on c.sid = d.pid);
2.错误: where 条件不够,每次都是更新该用户所有的数据。
update TableC c set amount = amount - numm*(select num from TableB b where sid = ssid and c.sid = b.pid) where uid = uuid ;
3.正确:
update TableC c,TableB b set c.amount = c.amount - numm*b.num where c.uid = uuid and c.sid = b.pid and b.sid = ssid;