更新行的唯一字段,并将现有行中的值设置为空

时间:2017-02-07 12:47:48

标签: mysql sql

我有一个带有唯一varchar列的表。此列包含我可以向其发送推送通知的Android和iOS设备ID。

如果用户在另一个已经存在于另一行的设备上登录他们的帐户,我希望原始帐户的列设置为null,而新行则包含设备ID。

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

编辑以根据您的答案澄清一些事情&注释:

我目前查询的内容是:

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

当表中的另一行已经存在device_id时,这会失败。

我使用REPLACE但它删除了行,并且行中还有其他数据不应该丢失。

设备ID虽然唯一,但不是表的主键。 该表是登录移动应用服务的移动用户帐户列表。他们的设备ID已更新为其帐户行,但仍然是唯一的。即使另一个用户存在相同的设备ID,我也希望更新行的设备ID - 我希望首先将其设置为null以实现唯一约束。

3 个答案:

答案 0 :(得分:0)

评论太长了。

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

但是,我不确定这是个好主意。为什么要忘记以前的设备ID?看起来它们可能很有用,例如,如果匿名用户访问该站点但没有登录。

答案 1 :(得分:0)

您可以在添加新行

之前将先前的ID设置为NULL
Update table
set
device_id=null
where accounted=your_account_id and device_id is not null

答案 2 :(得分:0)

您的设计出了问题。您希望能够为每个设备插入多行。但与此同时,您希望设备ID是唯一的。这并没有多大意义。您可能需要两个不同的表。一个将具有唯一索引并仅包含当前登录的用户。在另一个表中,您将"数据保存在不应丢失的行中。"。这实际上是一个日志表。由于设备ID在日志表中不是唯一的,因此您无需删除它 - 因此您可以保留更多信息。