php - 检查表中是否存在值或处理MySQL的唯一约束异常?

标签 php mysql performance apple-push-notifications unique-constraint

我正在开发一个 iOS 应用程序,使用户能够接收推送通知。因此,我必须为每个用户存储他们的 APN 设备 token 。我决定在每个 API 请求中搭载 APN 设备 token ,如果它尚不存在,则将其存储在数据库中。

表格设计很简单,只有一列'device_token':

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

现在我想知道,确保所有 token 都是唯一的会更昂贵吗?我看到两个选项:

  1. 对'device_token'设置唯一约束,只插入token,忽略任何可能发生的异常
  2. 首先,执行查询以检查 token 是否已存在,如果不存在,则将其插入。

第一个似乎是一个更“干净”的解决方案,从某种意义上说,它需要更少的代码,更容易维护。第二种解决方案只会在 token 尚不存在时添加一个额外的查询,以防止第一种不可避免的约束冲突。从逻辑上讲,后者应该更便宜,但需要更多的代码来完成。

此处的最佳做法是什么? MySQL 抛出异常代价高吗?

最佳答案

或者,您可以简单地执行 INSERT IGNORE ...(不需要唯一约束,因为它是主键,因此构造必须是唯一的)

来自 MySQL Reference Manual :

If you use the IGNORE keyword, errors that occur while executing the INSERT statement are ignored. For example, without IGNORE, a row that duplicates an existing UNIQUE index or PRIMARY KEY value in the table causes a duplicate-key error and the statement is aborted. With IGNORE, the row still is not inserted, but no error occurs. Ignored errors may generate warnings instead, although duplicate-key errors do not.

请注意,如果您的表中有其他列,您希望每次都更新(例如“上次使用”时间戳),您还可以使用 INSERT ... ON DUPLICATE KEY UPDATE ...

关于php - 检查表中是否存在值或处理MySQL的唯一约束异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21998996/

相关文章:

c# - 兼容 php、java 和 c# 的图像编码/解码方式

更新时MySQL错误1206

sql-server - 为什么在填充表后为其建立索引时 SQL Server 会运行得更快?

php - 在 SQL 中对排行榜进行排序并使用 PHP 在表中更新它的最有效方法

php - 计算具有两个值的行mysql(PHP错误)

php - 在 PHP 中解析和回显 SQL 结果

mysql - 在MySQL中创建一对多关系

python - Curve_fit 到 apply_along_axis。如何加快速度?

mysql - 优化 MySQL GROUP BY/ORDER BY 计算集合交集

PHPQuery WebBrowser 插件 - 使用 cookie