2016-09-08 71 views
1

考慮下面的例子:意外基數違規(子查詢返回多於1行)

甲MySQL表(table)與結構id主鍵),valueunique_id存在。

每當用戶點擊Button A,PHP執行以下查詢:

SELECT `id` FROM `table` WHERE `unique_id` = x; //where x is a `unique_id` 

如果查詢沒有返回值(IE x還沒有在unique_id列存在),新行插入table(在unique_id列中有x)。


...與該邏輯繼續:觀看Page A

查詢被執行:

SELECT `id` FROM `table` WHERE `unique_id` = x; 

今天收到以下錯誤:

SQLSTATE[21000]: Cardinality violation: 1242 Subquery returns more than 1 row 

這是我第一次有經驗這個問題(超過20k行的表)。

如果兩個單獨的用戶在恰好相同的時刻(低至毫秒)點擊Button A,那麼可以在unique_id列中將兩行寫入重複值?

如果是這樣,我將來如何避免再次發生這種情況? (我在這裏採取了錯誤的方法?)。

+0

我在這裏沒有看到子查詢。我錯過了什麼嗎? –

回答

3

隨着您使用的方法,答案很可能是兩個記錄可以創建。首先要做的是在unique_id列上實際創建UNIQUE INDEX。根據你的問題,它似乎沒有一個。

這引發了另一個問題。你真的需要表中的idunique_id嗎?它可能只能使用一個或另一個。 如果刪除unique_id並僅依賴主鍵並將其轉換爲自動增量字段,則不存在此問題。

如果您想繼續使用您當前的方法,請添加唯一索引,然後執行INSERT首先