2016-08-05 70 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(旧的) –