2017-02-07 29 views
0

我有一个具有唯一varchar列的表。此列包含我可以向其发送推送通知的Android和iOS设备ID。更新行的唯一字段并将现有行中的值设置为空

如果用户在其他设备上登录到其他设备上已存在该ID的帐户,我希望将原始帐户的列设置为空,并将新行替换为设备ID。

是否有一个语句可以实现这一点?或者我必须创建一个事务,该事务首先检查表中的值并在更新新记录之前将其设置为空?显然,如果我可以在一个声明中这样做,那将是更可取的。

我现在有一个查询的是::

UPDATE gp_login SET deviceOS='$OS', device_id='$deviceID', id_updated_at=NOW() WHERE email='$email' 

当然,当一个DEVICE_ID已经存在另一行中失败,根据答案&评论

编辑澄清几件事桌子。

我使用REPLACE播放,但它删除行,并有不应丢失的行中的其他数据。

设备ID尽管是唯一的,但不是表的主键。 该表格是登录到移动应用程序服务的移动用户帐户的列表。他们的设备ID已更新到其帐户行中,但仍然是唯一的。我想要更新一行的设备ID,即使其他用户存在相同的设备ID - 我只想先设置它为null,以满足唯一约束条件。

+0

您的查询在哪里? –

+0

你能否提供一个粗略的例子来正确引导你? – sagar

+0

感谢您的意见。我已经更新了这个问题。 – Cross2four

回答

0

这太长了评论。

在MySQL中没有一个语句可以同时执行updateinsert。你有一个选项是insert触发器。您可以编写一个触发器来删除以前的设备ID。

但是,我不确定这是一个好主意。为什么你想忘记以前的设备ID?它看起来像他们可能是有用的,例如,如果一个匿名用户来到现场,但没有登录。

+0

谢谢你,戈登。 请参阅最新的问题,因为我认为我之前并不清楚。 – Cross2four

0

您可以添加新的行之前设定的预IDS为NULL

Update table 
set 
device_id=null 
where accounted=your_account_id and device_id is not null 
0

是东西您的设计有误。您希望能够为每个设备插入多行。但同时你希望设备ID是唯一的。这没有什么意义。你可能需要两张不同的表格。一个将具有唯一的索引,并且只包含当前登录的用户。在另一个表格中,您将“不应该丢失的行中的数据”保存。这实际上是一个日志表。由于设备ID在日志表中不是唯一的,因此您无需删除它 - 因此您可以保留更多信息。

相关问题