在mysql存储的proc中有以下逻辑:
SET @UserId = (
Select userid
FROM tickets
where ticketid = ticketID
);这给了我一个错误:
子查询返回多于1行
我移除了它周围的设置,只运行了查询:
Select userid
FROM tickets
where ticketid = ticketID;我又拿了一张唱片,为什么要抱怨我有超过一排呢?滴答键也是那张桌子上的主键!
发布于 2016-07-07 23:02:37
似乎是WHERE子句中的谓词
ticketid = ticketID 对ticketid的所有非空值计算为TRUE。
本质上等同于指定
ticketid IS NOT NULL如果ticketid是主键,那么表中的每一行都将满足这个条件。
我只是猜这里。我怀疑您已经声明了一个名为ticketID的变量,并期望MySQL区分ticketid是对列的引用,还是ticketID是对变量的引用。但这是不可能的。如果有一个名为ticketID的过程变量(在SQL语句的作用域中声明),则MySQL将对ticketid的引用作为对该变量的引用。因此,如果ticketid变量有一个非空值,表中的每一行都将被返回。
来自MySQL参考手册:
局部变量不应具有与表列相同的名称。如果SQL语句,如SELECT .INTO语句包含对列和声明的具有相同名称的局部变量的引用,MySQL当前将对该名称的引用解释为变量的名称。
参考资料:http://dev.mysql.com/doc/refman/5.7/en/local-variable-scope.html
如果这就是问题所在(我只是猜测),一个解决办法是使用表名或表别名对列的引用进行限定。
许多开发人员还用前缀或其他约定命名变量,这使读者更容易区分变量名和列名,从而减少了歧义。
例如:
DECLARE lv_ticketid INT;
SET @UserId = ( SELECT t.userid FROM tickets t WHERE t.ticketid = lv_ticketid );在我们知道只返回一行的地方,我们还可以为查询添加一个限制1,这取决于我们是否希望在返回多个行时抛出错误。
SET @UserId = ( SELECT t.userid
FROM tickets t
WHERE t.ticketid = lv_ticketid
ORDER BY t.userid ASC
LIMIT 1
);发布于 2016-07-07 23:06:06
当涉及到列名和关键字时,MySQL不区分大小写.当您说where ticketid = ticketID时,它认为您只是说列ticketid的值与其本身相同,这将始终是正确的。尝试将变量更改为其他变量。
https://stackoverflow.com/questions/38256425
复制相似问题