2016-08-05 37 views
0

我想插入值,如果它存在「插入..重複更新」將更新它,但它不會更新自動增量val新插入one.I聽說插入在重複更新有一些錯誤,它總是生成新的ID,如果存在,它會刪除它,但我想得到確切的這個刪除的ID(當我使用last_inserted_id它只是返回最新的更新列的ID不是新插入一個)我想用新的插入的查詢更新id應該像下面這樣操作:insert if exists delete one one and insert new one(with auto increment)。我聽說有替換成,但速度很慢,我想用新插入的ID更新id 。插入重複更新獲取「新」生成的ID

+0

然後分兩步做。你需要一個真正的'delete',後面跟一個'insert'。這不是'重複密鑰更新'。 –

+0

@GordonLinoff但我聽說插入和刪除比插入更慢...重複更新 –

+0

@GordonLinoff我應該刪除,然後插入或有其他方式嗎?我只需要更新新值與新ID –

回答

0

尊重,如果您嘗試使用自動增量列執行奇特的更新邏輯,您就會玩火。

如果在更新它時需要一個新的自動增量id,那麼只需刪除舊的行並插入像Gordon所說的新行。

在某些數據庫工作負載下,可能會比使用insert on duplicate key update稍慢。但是除非你的桌子上至少有100個菜單,否則,除非你每天和每晚至少每秒執行10次這些操作,否則性能差異將變得微不足道。如果您確實有這種數據庫大小或工作負載,請向數據庫管理員諮詢。

REPLACE = DELETE,然後INSERT。 IODKU從不刪除。每個要求您指定一些UNIQUE密鑰的列,以便知道要使用的行。一個微妙點:如果有多個UNIQUE鍵,REPLACE可能會刪除多行,然後只插入一個。

IODKU可以通過使用... UPDATE id = LAST_INSERT_ID(id), ...來獲得id(現有的或新的)。

+0

好吧我會這樣做,但我想知道哪些重複的情況比刪除和插入更慢? –

+0

'REPLACE'必須做更多的工作,所以它可能總是比較慢。我添加了一些更多的信息給答案。 –

+0

你說LAST_INSERTED_ID我想得到這樣的東西更新ID與最後一個由「INSERT ...在重複更新」生成,但它給了我身份證本身的更新elem(舊的) –