如图,在触发器中定义变量hzid,并通过sql对其赋值。
其中的sql表示查询指定部门(部门id:-7485506144496172193)指定年份(2022年指定月份(4月份)的主键id,其结果查询只有一条
但系统却提示more than 1 row
经测试,在赋值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然后赋值时就会出现问题,所以建议在触发器中声明一个循环体,变量声明和赋值放到循环体中
根据错误提示可以看出:
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
经测试,被采纳答案为最早回答且最准确答案,是我太粗心了,“=”左右用了一样的字段,谢谢大家