Php 检查表或句柄MySQL'中是否存在值;唯一约束例外?

Php 检查表或句柄MySQL'中是否存在值;唯一约束例外?,php,mysql,performance,apple-push-notifications,unique-constraint,Php,Mysql,Performance,Apple Push Notifications,Unique Constraint,我正在开发一个iOS应用程序,它可以让用户接收推送通知。因此,我必须为每个用户存储他们的APN设备令牌。我已经决定在每个API请求上使用APN设备令牌,如果它还不存在,则将其存储在数据库中 表格设计非常简单,只有一列“device_token”: mysql> desc apn_devices; +--------------+-------------+------+-----+---------+-------+ | Field | Type | Null

我正在开发一个iOS应用程序,它可以让用户接收推送通知。因此,我必须为每个用户存储他们的APN设备令牌。我已经决定在每个API请求上使用APN设备令牌,如果它还不存在,则将其存储在数据库中

表格设计非常简单,只有一列“device_token”:

mysql> desc apn_devices;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| device_token | varchar(64) | NO   | PRI | NULL    |       |
+--------------+-------------+------+-----+---------+-------+
现在我想知道,为了确保所有代币都是唯一的,什么会更昂贵?我看到两种选择:

  • 对“设备\令牌”设置唯一约束,只需插入令牌并忽略可能发生的任何异常
  • 首先,执行查询以检查令牌是否已经存在,如果不存在,则插入它
  • 第一个似乎是一个更“干净”的解决方案,从某种意义上说,它需要更少的代码,更易于维护。第二个解决方案将仅在令牌尚不存在时添加一个额外的查询,以防止不可避免地违反第一个解决方案的约束。从逻辑上看,后者应该更便宜,但需要更多的代码来完成


    这里的最佳实践是什么?MySQL抛出异常代价高吗?

    或者,您可以简单地执行一个
    插入忽略…
    (不需要唯一约束,因为它是主键,因此通过构造必须是唯一的)

    发件人:

    如果使用IGNORE关键字,则会忽略执行INSERT语句时发生的错误。例如,在不忽略的情况下,复制表中现有唯一索引或主键值的行将导致重复键错误,语句将中止。使用IGNORE时,仍不会插入行,但不会发生错误。忽略的错误可能会生成警告,但重复的键错误不会


    请注意,如果您的表中有其他列希望每次都更新(例如“上次使用的”时间戳),您也可以使用
    INSERT。。。重复密钥更新…

    不错!我不知道IGNORE关键字存在。它对于像您这样的情况非常方便,重复密钥更新上的
    构造在您希望插入(如果不存在)或更新(如果存在)时非常方便。我一直不明白他们为什么不使用相同的形式来处理这两个问题,尽管(例如,重复键忽略上的
    构造)版本2需要正确地封装在事务中,否则您可能会给自己造成一个问题。除非您可能在一个查询中同时执行这两个操作(即版本2),通过使用
    INSERT…SELECT
    和SELECT查询,该查询仅在数据库中尚未找到要插入的值时返回该值。