mysql - 如果值存在,更新

标签 mysql

好的,我有一张表,我将在其中收集用户设备。当用户登录时,我希望它注册设备,如果它已经存在,它只想更新时间戳。这仅在用户登录时发生。

表格如下所示:

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_namedevice_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/

相关文章:

php - 如何使用 MYSQLi 查询从数据库中以 php 显示图像?

mysql - 存储过程中的日期部分

php - 加入数据库并计数

mysql - 查询在 Mysql 中不起作用

PHP : applying html_entity_decode to whole result array

php - 尽管密码正确,password_verify 密码始终无效

带分区的 Mysql 查询比不带分区花费更多时间

PHP if 语句只起作用了一半

php - mysql_fetch 无法收集数据库中的所有数据

c# - 搜索值库时如何使用OR输出结果?