2016-07-07 82 views
0

我有一个MySQL存储过程以下逻辑:MySQL的抱怨多行

SET @UserId = (
Select userid 
FROM tickets 
where ticketid = ticketID 
); 

它给我一个错误:

Subquery returns more than 1 row

我删除它周围的一套,只是运行查询:

Select userid 
FROM tickets 
where ticketid = ticketID; 

我找回1条记录,为什么它抱怨我有超过1行? ticketid也是该桌上的主要关键!

+0

为什么1 = 1? – Drew

回答

2

好像在WHERE子句

ticketid = ticketID 

将评估为TRUE ticketid的所有非空值的谓语。

基本上相当于指定

ticketid IS NOT NULL 

如果ticketid是主键,则表中的每一行会满足该条件。


我只是猜测在这里。我怀疑你已经声明了一个名为ticketID的变量,并希望MySQL区分ticketid作为对列的引用,并且ticketID是对变量的引用。但是这并没有发生。如果有一个名为ticketID的过程变量(在SQL语句的范围内声明),MySQL将引用ticketid作为变量的参考。因此,如果ticketid变量具有非空值,那么表格中的每一行都将被返回。


从MySQL参考手册:

A local variable should not have the same name as a table column. If an SQL statement, such as a SELECT ... INTO statement, contains a reference to a column and a declared local variable with the same name, MySQL currently interprets a reference to that name as the name of a variable.

参考: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); 

而且,我们知道,只有一行将被退回,我们还可以添加一个LIMIT 1到查询,这取决于我们是否要抛出一个错误,当有一个以上一行返回。

SET @UserId = (SELECT t.userid 
        FROM tickets t 
        WHERE t.ticketid = lv_ticketid 
        ORDER BY t.userid ASC 
        LIMIT 1 
       ); 
+0

就是这样,它有一个区分字段和变量“ticketId”的问题 – TheWebGuy

0

对于列名和关键字,MySQL不区分大小写。当你说where ticketid = ticketID它认为你只是说ticketid列的价值是相同的,这将永远是真实的。尝试将变量更改为其他内容。