gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:02:02 24 4
gpt4 key购买 nike

我正在开发一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com