好的,我有一张表,我将在其中收集用户设备。当用户登录时,我希望它注册设备,如果它已经存在,它只想更新时间戳。这仅在用户登录时发生。
表格如下所示:
device_id => BIGINT AUTOINCREMENT PRIMARY KEY
user_id => BIGINT FOREIGN KEY users(id)
device_name => VARCHAR(40) (Will be like 'Donald ducks iphone')
device_type => VARCHAR(10) (Will be defined by the client, like "IOS")
last_usage => TIMESTAMP (On update, new timestamp and all that)
因此,当用户登录时,我有 user_id、device_name、device_type。
我想要的: 如果 id、name 和 type 已经存在于一行中,只需更新时间戳,否则插入值。
因为这与主键无关,所以我不知道该怎么做。当然,我可以先选择这些值,然后返回并进行更新/插入,但这感觉不对:)
最佳答案
首先,使device_name
和device_type
唯一。
现在您有几个选择。您可以使用:
INSERT IGNORE INTO devices (...) VALUES(...)
或者如果您担心重要的错误可能会被忽略,请使用:
INSERT INTO devices (...) VALUES(...)
ON DUPLICATE KEY UPDATE device_id = device_id
请注意,这与 REPLACE
不同,因为这根本不会影响旧记录,而 REPLACE
将创建新的 ID 和时间戳。
编辑:由于您现在想要更新时间戳,请使用:
INSERT INTO devices (...) VALUES(...)
ON DUPLICATE KEY UPDATE last_usage = NOW()
关于mysql - 如果值存在,更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13497789/