[英]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 | |
+--------------+-------------+------+-----+---------+-------+
現在我想知道,確保所有令牌都是唯一的會更昂貴嗎? 我看到兩個選擇:
第一個似乎是一個更“干凈”的解決方案,從某種意義上講,它需要較少的代碼,更易於維護。 第二種解決方案將僅在令牌不存在時添加一個附加查詢,以防止不可避免地違反第一種約束。 從邏輯上考慮,后者應該較便宜,但需要更多代碼來完成。
什么是最佳做法? MySQL引發異常是否昂貴?
或者,您可以簡單地執行INSERT IGNORE ...
(因為它是主鍵,所以不需要唯一約束,因此構造必須是唯一的)
從MySQL參考手冊 :
如果使用IGNORE關鍵字,則在執行INSERT語句時發生的錯誤將被忽略。 例如,如果沒有IGNORE,則復制表中現有UNIQUE索引或PRIMARY KEY值的行會導致重復鍵錯誤,並且該語句將中止。 使用IGNORE,該行仍未插入,但不會發生錯誤。 被忽略的錯誤可能會生成警告,盡管不會出現重復鍵錯誤。
請注意,如果表中還有其他列想要每次更新(例如“上次使用”時間戳),則還可以使用INSERT ... ON DUPLICATE KEY UPDATE ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.