Php 检查表或句柄MySQL'中是否存在值;唯一约束例外?
我正在开发一个iOS应用程序,它可以让用户接收推送通知。因此,我必须为每个用户存储他们的APN设备令牌。我已经决定在每个API请求上使用APN设备令牌,如果它还不存在,则将其存储在数据库中 表格设计非常简单,只有一列“device_token”: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
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查询,该查询仅在数据库中尚未找到要插入的值时返回该值。