簡體   English   中英

檢查表中是否存在值或處理MySQL的唯一約束異常?

[英]Check if value exists in table or handle MySQL's unique constraint exception?

我正在開發一個iOS應用,該應用將使用戶能夠接收推送通知。 因此,我必須為每個用戶存儲他們的APN設備令牌。 我已決定在每個API請求上都附帶APN設備令牌,如果尚不存在,則將其存儲在數據庫中。

該表的設計非常簡單,只有一列“ device_token”:

mysql> desc apn_devices;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| device_token | varchar(64) | NO   | PRI | NULL    |       |
+--------------+-------------+------+-----+---------+-------+

現在我想知道,確保所有令牌都是唯一的會更昂貴嗎? 我看到兩個選擇:

  1. 對“ device_token”施加唯一約束,只需插入令牌並忽略可能發生的任何異常
  2. 首先,執行查詢以檢查令牌是否已經存在,如果不存在,則將其插入。

第一個似乎是一個更“干凈”的解決方案,從某種意義上講,它需要較少的代碼,更易於維護。 第二種解決方案將僅在令牌不存在時添加一個附加查詢,以防止不可避免地違反第一種約束。 從邏輯上考慮,后者應該較便宜,但需要更多代碼來完成。

什么是最佳做法? MySQL引發異常是否昂貴?

或者,您可以簡單地執行INSERT IGNORE ... (因為它是主鍵,所以不需要唯一約束,因此構造必須是唯一的)

MySQL參考手冊

如果使用IGNORE關鍵字,則在執行INSERT語句時發生的錯誤將被忽略。 例如,如果沒有IGNORE,則復制表中現有UNIQUE索引或PRIMARY KEY值的行會導致重復鍵錯誤,並且該語句將中止。 使用IGNORE,該行仍未插入,但不會發生錯誤。 被忽略的錯誤可能會生成警告,盡管不會出現重復鍵錯誤。

請注意,如果表中還有其他列想要每次更新(例如“上次使用”時間戳),則還可以使用INSERT ... ON DUPLICATE KEY UPDATE ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM