首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL抱怨多行

问MySQL抱怨多行
EN

Stack Overflow用户
提问于 2016-07-07 22:45:34
回答 2查看 37关注 0票数 0

在mysql存储的proc中有以下逻辑:

代码语言:javascript
复制
SET @UserId = (
Select userid
FROM tickets
where ticketid = ticketID
);

这给了我一个错误:

子查询返回多于1行

我移除了它周围的设置,只运行了查询:

代码语言:javascript
复制
Select userid
FROM tickets
where ticketid = ticketID;

我又拿了一张唱片,为什么要抱怨我有超过一排呢?滴答键也是那张桌子上的主键!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-07 23:02:37

似乎是WHERE子句中的谓词

代码语言:javascript
复制
 ticketid = ticketID 

对ticketid的所有非空值计算为TRUE。

本质上等同于指定

代码语言:javascript
复制
 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

如果这就是问题所在(我只是猜测),一个解决办法是使用表名或表别名对列的引用进行限定。

许多开发人员还用前缀或其他约定命名变量,这使读者更容易区分变量名和列名,从而减少了歧义。

例如:

代码语言:javascript
复制
  DECLARE lv_ticketid INT; 

  SET @UserId = ( SELECT t.userid FROM tickets t WHERE t.ticketid = lv_ticketid );

在我们知道只返回一行的地方,我们还可以为查询添加一个限制1,这取决于我们是否希望在返回多个行时抛出错误。

代码语言:javascript
复制
  SET @UserId = ( SELECT t.userid
                   FROM tickets t
                  WHERE t.ticketid = lv_ticketid 
                  ORDER BY t.userid ASC
                  LIMIT 1 
                );
票数 2
EN

Stack Overflow用户

发布于 2016-07-07 23:06:06

当涉及到列名和关键字时,MySQL不区分大小写.当您说where ticketid = ticketID时,它认为您只是说列ticketid的值与其本身相同,这将始终是正确的。尝试将变量更改为其他变量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38256425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档