MySQL的抱怨多行
我有一个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也是该桌上的主要关键!
好像在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
);
就是这样,它有一个区分字段和变量“ticketId”的问题 – TheWebGuy
对于列名和关键字,MySQL不区分大小写。当你说where ticketid = ticketID
它认为你只是说ticketid
列的价值是相同的,这将永远是真实的。尝试将变量更改为其他内容。
为什么1 = 1? – Drew