Mysql 调用存储过程的触发器正在更新表上的每个数据,而不是只更新一个数据

Mysql 调用存储过程的触发器正在更新表上的每个数据,而不是只更新一个数据,mysql,sql,Mysql,Sql,因此,我有两个表,table_a,其中有两个触发器用于插入和更新另一个表(table_b)中的字段 主要的问题是,delete和insert触发器工作得很好,但是使用update触发器时,它不是只更新表_b上具有相同uid的字段,而是更新每个字段(20k+个字段)。我不确定我做错了什么,因为当我单独运行sp代码(更新查询)时,它会正常工作。但它在存储过程中不起作用。贝娄,我准备好了 触发代码: CREATE definer=`test_user`@`%` TRIGGER `trg_update

因此,我有两个表,table_a,其中有两个触发器用于插入和更新另一个表(table_b)中的字段

主要的问题是,delete和insert触发器工作得很好,但是使用update触发器时,它不是只更新表_b上具有相同uid的字段,而是更新每个字段(20k+个字段)。我不确定我做错了什么,因为当我单独运行sp代码(更新查询)时,它会正常工作。但它在存储过程中不起作用。贝娄,我准备好了

触发代码:

 CREATE definer=`test_user`@`%` TRIGGER `trg_update` after
  UPDATE
  ON `table_a` FOR EACH row CALL sp_update(old.uid,new.name, new.number) 
CREATE DEFINER=`test_user`@`%` PROCEDURE `sp_update`(IN `uid` CHAR(50), IN `name` CHAR(50), IN `number` CHAR(50))
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
    SET @UID = uid;
    SET @NAME= name;
    SET @NUMBER= number;
UPDATE tbl_master
SET
    name = @NAME,
    number = @NUMBER
where
  uid = @UID;
END
存储过程代码:

 CREATE definer=`test_user`@`%` TRIGGER `trg_update` after
  UPDATE
  ON `table_a` FOR EACH row CALL sp_update(old.uid,new.name, new.number) 
CREATE DEFINER=`test_user`@`%` PROCEDURE `sp_update`(IN `uid` CHAR(50), IN `name` CHAR(50), IN `number` CHAR(50))
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
    SET @UID = uid;
    SET @NAME= name;
    SET @NUMBER= number;
UPDATE tbl_master
SET
    name = @NAME,
    number = @NUMBER
where
  uid = @UID;
END
提前谢谢

编辑:对于那些想要测试它的人来说,一个包含过程中涉及的每个触发器和sp的测试表:

表格

CREATE TABLE `table_a` (
    `a` INT(11) NULL DEFAULT NULL,
    `b` INT(11) NULL DEFAULT NULL,
    `c` INT(11) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `table_b` (
    `a` INT(11) NULL DEFAULT NULL,
    `b` INT(11) NULL DEFAULT NULL,
    `c` INT(11) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
CREATE DEFINER=`root`@`%` TRIGGER `trg_insert` AFTER INSERT ON `table_a` FOR EACH ROW CALL sp_insert(new.a, new.b, new.c);

CREATE DEFINER=`root`@`%` TRIGGER `trg_update` AFTER UPDATE ON `table_a` FOR EACH ROW BEGIN
call sp_update(old.a,new.b,new.c);
END;
CREATE DEFINER=`root`@`%` PROCEDURE `sp_insert`(IN `a` INT, IN `b` INT, IN `c` INT)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
begin
SET @A  =a;
SET @B = b;
SET @C = c;
insert into table_b (a,b,c) values (@A, @B, @C);
end

CREATE DEFINER=`root`@`%` PROCEDURE `sp_update`(IN `a` INT, IN `b` INT, IN `c` INT)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
set @A = a;
set @B = b;
set @C = c;
update table_b set b=@B, c=@c where a=@A;
END
触发器

CREATE TABLE `table_a` (
    `a` INT(11) NULL DEFAULT NULL,
    `b` INT(11) NULL DEFAULT NULL,
    `c` INT(11) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `table_b` (
    `a` INT(11) NULL DEFAULT NULL,
    `b` INT(11) NULL DEFAULT NULL,
    `c` INT(11) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
CREATE DEFINER=`root`@`%` TRIGGER `trg_insert` AFTER INSERT ON `table_a` FOR EACH ROW CALL sp_insert(new.a, new.b, new.c);

CREATE DEFINER=`root`@`%` TRIGGER `trg_update` AFTER UPDATE ON `table_a` FOR EACH ROW BEGIN
call sp_update(old.a,new.b,new.c);
END;
CREATE DEFINER=`root`@`%` PROCEDURE `sp_insert`(IN `a` INT, IN `b` INT, IN `c` INT)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
begin
SET @A  =a;
SET @B = b;
SET @C = c;
insert into table_b (a,b,c) values (@A, @B, @C);
end

CREATE DEFINER=`root`@`%` PROCEDURE `sp_update`(IN `a` INT, IN `b` INT, IN `c` INT)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
set @A = a;
set @B = b;
set @C = c;
update table_b set b=@B, c=@c where a=@A;
END
程序

CREATE TABLE `table_a` (
    `a` INT(11) NULL DEFAULT NULL,
    `b` INT(11) NULL DEFAULT NULL,
    `c` INT(11) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `table_b` (
    `a` INT(11) NULL DEFAULT NULL,
    `b` INT(11) NULL DEFAULT NULL,
    `c` INT(11) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
CREATE DEFINER=`root`@`%` TRIGGER `trg_insert` AFTER INSERT ON `table_a` FOR EACH ROW CALL sp_insert(new.a, new.b, new.c);

CREATE DEFINER=`root`@`%` TRIGGER `trg_update` AFTER UPDATE ON `table_a` FOR EACH ROW BEGIN
call sp_update(old.a,new.b,new.c);
END;
CREATE DEFINER=`root`@`%` PROCEDURE `sp_insert`(IN `a` INT, IN `b` INT, IN `c` INT)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
begin
SET @A  =a;
SET @B = b;
SET @C = c;
insert into table_b (a,b,c) values (@A, @B, @C);
end

CREATE DEFINER=`root`@`%` PROCEDURE `sp_update`(IN `a` INT, IN `b` INT, IN `c` INT)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
set @A = a;
set @B = b;
set @C = c;
update table_b set b=@B, c=@c where a=@A;
END

所以,我设法找出了导致这个问题的原因。我不确定它是否相关,但由于MySQL服务器在windows服务器上运行,我不确定这个问题是否与操作系统相关,或者是数据库本身的行为

基本上,我发现我不能使用相同的变量名(输入是小写的,而例程体变量是大写的)。因此,我不得不将其从:

CREATE DEFINER=`root`@`%` PROCEDURE `sp_update`(IN `a` INT, IN `b` INT, IN `c` INT)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
set @A = a;
set @B = b;
set @C = c;
update table_b set b=@B, c=@c where a=@A;
END
致:


不确定是因为我使用了相同的变量名,还是因为mysql没有识别大小写字符之间的差异。因此,我设法找出了导致此问题的原因。我不确定它是否相关,但由于MySQL服务器在windows服务器上运行,我不确定这个问题是否与操作系统相关,或者是数据库本身的行为

基本上,我发现我不能使用相同的变量名(输入是小写的,而例程体变量是大写的)。因此,我不得不将其从:

CREATE DEFINER=`root`@`%` PROCEDURE `sp_update`(IN `a` INT, IN `b` INT, IN `c` INT)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
set @A = a;
set @B = b;
set @C = c;
update table_b set b=@B, c=@c where a=@A;
END
致:


不确定是因为我使用了相同的变量名,还是因为mysql没有识别小写/大写字符之间的差异,这是我的错。

@RyanVincent我在粘贴代码的测试表中使用了非常小的值。比如1,2,3。不过,我还是得到了同样的行为。@RyanVincent似乎触发器没有传递旧的.a值。@RyanVincent我忘了提到,我们的客户端正在运行mysql 5.2,也许这种行为不会发生在最新版本上:\@RyanVincent我在粘贴代码的这个测试表中使用了非常小的值。比如1,2,3。不过,我还是得到了相同的行为。@RyanVincent触发器似乎没有传递旧的.a值。@RyanVincent我忘了提到,我们的客户机正在运行mysql 5.2,也许这种行为不会发生在最新版本上:\