2016-07-07 109 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列的價值是相同的,這將永遠是真實的。嘗試將變量更改爲其他內容。