2

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

该表如下所示:

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 已经连续存在,只需更新时间戳,否则插入值。

由于这与主键无关,我不知道该怎么做。当然,我可以做一些事情,比如先选择这些值,然后返回,然后进行更新/插入,但这感觉不对:)

4

4 回答 4

3

您可以在 MySQL 5.0+中使用REPLACE :

REPLACE 的工作方式与 INSERT 完全相同,只是如果表中的旧行与 PRIMARY KEY 或 UNIQUE 索引的新行具有相同的值,则在插入新行之前删除旧行

例子:

REPLACE INTO TableName (user_id, device_id, device_name, device_type, last_usage) VAULES (1, 2, "Test Device Name, "Test Type", NOW()); 
于 2012-11-21T16:37:07.243 回答
3

首先,制作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()
于 2012-11-21T16:36:24.307 回答
0
For Each r In Me.Lstbox_Tables.ItemsSelected

'Create a recordset with required data

sql = "SELECT * FROM " & Me.Lstbox_Tables.ItemData(r)

'tablename = "Gahpp00d_" + rs!Table_Name

Set rs = db.OpenRecordset(sql, dbReadOnly)

Dim SheetName As String

SheetName = Replace(Me.Lstbox_Tables.ItemData(r), "GAHPP00D_", "")


On Error Resume Next

excelWbk.Sheets(SheetName).Select

If Err.Number <> 0 Then

MsgBox Err.Number & ":" & Err.Description, vbCritical, "ERROR!!!"

MsgBox "Worksheet " & SheetName & " doesn't exist.", vbCritical, "Sheet Missing!!!"

excelWbk.Close False

appExcel.Quit


 Exit Sub

 End If
于 2012-11-21T16:36:41.067 回答
0

您可能需要将其转换为 mysql 作为其 mssql,但类似于以下内容:

declare @count int
declare @user varchar
declare @machine varchar
declare @type as varchar

select @count = (select count(*) from [table] where user = @user and machine=@machine and type=@type)

if @count = 0
begin
insert into
[table]
select
@machine,
@user,
@type,
current_timestamp
end

if @count > 0
begin
update
[table]
set timestamp = current_timestamp
where
machine = @machine
and
user = @user
and
type = @type
end

问候,

马库斯

于 2012-11-21T16:45:30.340 回答