【问题标题】:mysql stored procedure - select... for updatemysql 存储过程 - 选择...进行更新
【发布时间】:2011-10-11 03:32:30
【问题描述】:

我在存储过程中使用“选择...进行更新”。 但是当存储过程完成时,它会从我一开始所做的“选择...更新”返回结果。有没有办法让它阻塞行而不返回它们?

存储过程代码:

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 的好方法吗? 非常感谢您的宝贵时间。

【问题讨论】:

    标签: mysql stored-procedures select auto-increment


    【解决方案1】:

    您可以LOCK TABLE(MyISAM 表)或BEGIN TRANSACTION 或语法(对于 InnoDB 或 Maria 等支持事务的表引擎)。

    更新:哦,现在我看到你开始交易了。那么,那么:

    MySQL 存储过程返回最后执行的 SELECT 的结果。因此,如果您想返回其他结果集,只需执行另一个 SELECT。

    【讨论】:

    • 感谢您的帮助 Ondra。我正在使用 inoodb。我认为不可能在存储过程中使用锁定表 =S 来使用另一个选择听起来不错,但我不希望“选择...更新”与必要的数据一起旅行。谢谢。你知道我是否可以这样使用序列吗?
    【解决方案2】:

    如果您使用触发器和序列来递增和插入 id,那么您永远不必从您要插入或更新的表中选择 max(),并且可能不会遇到这个问题,我从未使用过 select 进行更新..

    【讨论】:

    • 感谢您对 gamBit 的帮助,我知道使用触发器的序列解决方案,但我想知道这种方式是否有效。
    猜你喜欢
    • 2021-09-25
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 2010-12-15
    • 2011-01-07
    相关资源
    最近更新 更多