mysql 通过select语句给触发器的变量赋值,但提示more than 1 row

问题遇到的现象和发生背景

如图,在触发器中定义变量hzid,并通过sql对其赋值。

img

问题相关代码,请勿粘贴截图

其中的sql表示查询指定部门(部门id:-7485506144496172193)指定年份(2022年指定月份(4月份)的主键id,其结果查询只有一条

img

运行结果及报错内容

但系统却提示more than 1 row

img

我的解答思路和尝试过的方法

经测试,在赋值sql语句最后加入limit 1就不报错了,但我不想这么做。因为这么做会取到错误的值。

我想要达到的结果

请网大家帮忙看下,是哪里的问题,我要如何解决?谢谢


set hzid = (select id from bip_ in.oatobipzjhz where deptid = deptid and yearTime = yt and monthTime = mt);

你where后面第一个条件是deptid=deptid,这不是错了吗?

试试any或者some关键字呢

这个错误就是告诉你不止一条数据,一定不会错的,就是这个原因;
至于你说的验证了数据只有一条应该验证条件和那个执行条件不同,你在仔细缕一下吧

原因:首先你指定部门(部门id:-7485506144496172193)指定年份(2022年)指定月份(4月份)查询的sql没有问题,但是你的触发器语句中第23行代码如果不限制limit1的话查询出的deptId可能就有多个,这样就会查询多条部门id然后赋值时就会出现问题,所以建议在触发器中声明一个循环体,变量声明和赋值放到循环体中

img


变量名换一下,不要和where中的字段名相同

根据错误提示可以看出:

set hzid = (select id from bip_ _in. oatobipzjhz where deptid = deptid and yearTime = yt and monthTime = mt); 

你这个存在多个值

所以 建议修改成:

set hzid = (select id from bip_ _in. oatobipzjhz where deptid = deptid and yearTime = yt and monthTime = mt order by id desc limit 1);

还有一点要注意的时候
就是你设置的变量名:
set deptid = (select ID from org_ unit where PATH = v0 and STATUS = 1 and IS DELETED = 0 limit 1)

set hzid = (select id from bip_ _in. oatobipzjhz where deptid = deptid and yearTime = yt and monthTime = mt);

这里面的字段名相同了,这里如果你deptid = deptid 的意思是想字段=变量,那很容易出错的,所以这里尽量使用字段名和变量名不相同的

你的部门编号deptid和变量重名了,变量名不要跟字段名相同,建议变量名前面加个v_,可以避免这种小错误

问题已经有人解答了,deptid=deptid问题。
我就是问问你,这个触发器这么复杂的逻辑,你在执行时不使用事务吗?执行出错不回滚,数据不一致,你不是要抓狂啊?

后面加一个容错处理,有可能有重复数据要去掉,加limit 1

https://ask.csdn.net/questions/7442832?spm=1005.2026.3001.5635&utm_medium=distribute.pc_relevant_ask_down.none-task-ask-2~default~OPENSEARCH~Rate-3.pc_feed_download_top3ask&depth_1-utm_source=distribute.pc_relevant_ask_down.none-task-ask-2~default~OPENSEARCH~Rate-3.pc_feed_download_top3ask

经测试,被采纳答案为最早回答且最准确答案,是我太粗心了,“=”左右用了一样的字段,谢谢大家