我在存储过程中使用“select ... for update”。 但是当存储过程完成时,它返回我在开头做的“select ... for update”的结果。有没有办法让它阻止行而不返回它们?
存储过程代码:
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_save`(
in param_cod_emp char(5),
in param_cod_tab char(5),
in param_des_tab varchar(45),
in param_flg_new char(1))
BEGIN
declare var_cod_tab char(5);
start transaction;
select *
from tabla
where cod_emp=param_cod_emp
for update;
if(param_flg_new='0') then
set var_cod_tab=
(select max(cod_tab)+1
from tabla
where cod_emp=param_cod_emp);
insert into tabla(
cod_emp,
cod_tab,
des_tab)
values(
param_cod_emp,
var_cod_tab,
param_des_tab);
else
udpate tabla where
des_tab=param_des_tab
where cod_emp=param_cod_emp
and cod_tab=param_cod_tab;
end if;
commit;
END
这个代码是一个使char列看起来像auto_increment的好方法吗? 非常感谢你的时间。
答案 0 :(得分:1)
您可以LOCK TABLE
(MyISAM表)或BEGIN TRANSACTION
或语法(对于InnoDB或Maria等具有交易功能的表引擎)。
更新:哦,现在我看到你做了START TRANSACTION。好吧,那么:
MySQL存储过程返回上次执行SELECT的结果。因此,如果要返回其他结果集,只需执行另一个SELECT。
答案 1 :(得分:0)
如果您使用触发器和序列来递增并插入id,那么您永远不必从正在插入或更新的表中选择max()并且可能不会出现此问题,我从未使用过选择更新..