2012-11-21 45 views
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已經存在於一行中,只是更新時間戳,否則插入值。

由於這與主鍵無關,我不知道如何做到這一點。當然,我可以做這樣的事情首先選擇這些值,返回事後做更新/插入,但這並不感覺吧:)

回答

3

首先,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() 
+0

如果值已經存在,'INSERT IGNORE'跳過;它不更新它。請參閱http://stackoverflow.com/a/4723200/924643 –

+0

當然,但由於device_id是AUTO_INCREMENT(我不知道插入/更新此ID),它創建它呢...主鍵不能是相同的它是auto_increment。我應該設置這些列,我有其他的鍵類型或什麼? – gubbfett

+0

@ aam1r是的我知道,這是所需的行爲。 'REPLACE'將改變ID和時間戳,這是錯誤的。 –

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 
+1

它在OP的問題中說,他們會在vb中回答這個問題嗎? ?此外,這個答案與這個問題有什麼關係? – Ric

3

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

插入新行前更換作品酷似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()); 
+0

這取代了舊的記錄,改變了ID和時間戳,而OP希望它不做任何事情。 –

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 [email protected] and [email protected]) 

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 

問候,

Marcus

+0

我會說你的設置的一件事是,如果一些用戶使用相同的設備,你將有多個條目的設備。如果這是爲庫存目的設計的,我可能會建議更新用戶名。 –