参考文章:这里写链接内容。
我发现的问题和这篇文章一样
在编写触发器中,发现生成的数据有些不正常,其中变量的值在赋值不成功的情况下(SELECT pid INTO @b2 FROM t_test WHERE id = 1;其中id为1的记录不存在),会和上次执行的值一样。
测试
DROP TABLE IF EXISTS `t_test`;
CREATE TABLE `t_test` (
`id` int(11) NOT NULL,
`pid` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- ----------------------------
-- Records of t_test
-- ----------------------------
INSERT INTO `t_test` VALUES ('2', '3');
INSERT INTO `t_test` VALUES ('3', '4');
INSERT INTO `t_test` VALUES ('4', '2');
执行这条语句
SELECT pid INTO @b2 FROM t_test WHERE id = 1;
SELECT @b2;
输出为 null。
在同一窗口执行
SELECT pid INTO @b2 FROM t_test WHERE id = 3;
SELECT @b2;
输出为4。
在同一窗口再次执行
SELECT pid INTO @b2 FROM t_test WHERE id = 1;
SELECT @b2;
输出还为4。
解释
mysql的局部变量就和我们写的程序一样,也是有生存域的,叫做session specific。
解决方法
不要使用prefix with @的变量,使用DECLARE start INT unsigned DEFAULT 1;