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