好像在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
);
爲什麼1 = 1? – Drew