Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“替换”和“插入”之间的实际区别是什么。。。MySQL中的重复密钥更新?_Mysql_Sql_Insert_Replace - Fatal编程技术网

“替换”和“插入”之间的实际区别是什么。。。MySQL中的重复密钥更新?

“替换”和“插入”之间的实际区别是什么。。。MySQL中的重复密钥更新?,mysql,sql,insert,replace,Mysql,Sql,Insert,Replace,我需要的是设置具有特定键的记录的所有字段的值(该键实际上是复合键),如果还没有具有此类键的记录,则插入该记录 似乎是为了做这项工作,但同时它的手册页面显示 我最好选择哪一个?为什么 我想到的REPLACE的唯一“副作用”是,它会在插入时增加自动增量值(幸运的是我没有使用任何值)。。。在重复密钥更新时可能不会。需要考虑的其他实际差异是什么?在哪些特定情况下,替换优于插入。。。在重复密钥更新时,反之亦然?REPLACE在内部执行删除,然后执行插入。如果外键约束指向该行,则可能会导致问题。在这种情况

我需要的是设置具有特定键的记录的所有字段的值(该键实际上是复合键),如果还没有具有此类键的记录,则插入该记录

似乎是为了做这项工作,但同时它的手册页面显示

我最好选择哪一个?为什么


我想到的
REPLACE
的唯一“副作用”是,它会在
插入时增加自动增量值(幸运的是我没有使用任何值)。。。在重复密钥更新时
可能不会。需要考虑的其他实际差异是什么?在哪些特定情况下,
替换
优于
插入。。。在重复密钥更新时,反之亦然?

REPLACE
在内部执行删除,然后执行插入。如果外键约束指向该行,则可能会导致问题。在这种情况下,
REPLACE
可能会失败或更糟:如果外键设置为级联删除,则
REPLACE
将导致删除其他表中的行。即使在
REPLACE
操作之前和之后都满足了约束,也可能发生这种情况


使用
插入。。。在重复密钥更新时
可避免此问题,因此首选。

Replace似乎在密钥已存在的情况下执行两个操作。也许这意味着两者之间存在速度差异

(插入)一次更新与一次删除+一次插入(替换)


编辑:我的意思是替换可能会慢一点,这实际上是完全错误的。好吧,根据这篇博文无论如何

使用
替换
而不是
插入时。。。在重复密钥更新时
,当给定密钥的多个查询快速到达时,我有时会观察到密钥锁定或死锁问题。后者的原子性(除了不会导致级联删除之外)更是使用它的理由

在什么样的特殊情况下,可以首选替换而不是插入。。。在…上 重复密钥更新,反之亦然

我刚刚发现,对于使用联邦存储引擎的表,
INSERT…ON DUPLICATE KEY UPDATE
语句是可以接受的,但如果出现重复密钥冲突,则会失败(错误为1022:无法写入;表中存在重复密钥…)——请参阅MySQL参考手册中相应的项目符号


幸运的是,我能够在插入后触发器中使用
REPLACE
而不是
INSERT…ON DUPLICATE KEY UPDATE
,以实现将更改复制到联合表的预期结果。

如果没有列出所有列,我认为
REPLACE
将使用替换行中的默认值重置任何未提及的列<重复键更新时的code>将保持未提及的列不变。

为了回答性能方面的问题,我使用这两种方法进行了测试

替换为:
1.尝试在表上插入
2.如果1失败,请删除行并插入新行

重复密钥更新时插入涉及:
1.尝试在表上插入
2.如果1失败,则更新行

如果所有涉及的步骤都是插入,那么性能应该没有差别。速度必须取决于涉及的更新数量。最坏的情况是所有语句都是更新的

我在InnoDB表中尝试了这两个语句,涉及62510个条目(仅更新)。露营速度:
替换为:77.411秒
重复密钥更新时插入:2.446秒

Insert on Duplicate Key update is almost 32 times faster.
表大小:Amazon m3.medium上有12列1249250行

“在出现重复键错误的情况下,存储引擎可能会将替换作为更新而不是删除加插入来执行,但语义是相同的。”


替换有时似乎是必要的,因为INSERT IGNORE似乎不适用于数据转换

如果我这样做,我只会将largestCityPop设置为自身:

将忽略插入最大城市(stateID、largestCityPop、statePop) 选择stateID,MAX(city.pop)作为最大的citypop,state.pop FROM city 在city.stateID上加入state=按city.stateID在上加入state.ID组 重复密钥更新largestCityPop=largestCityPop

如果我这样做,我就不正确地使用了GROUP函数:

将忽略插入最大城市(stateID、largestCityPop、statePop) 选择stateID,MAX(city.pop)作为最大的citypop,state.pop FROM city 在city.stateID上加入state=按city.stateID在上加入state.ID组 重复密钥更新largestCityPop=MAX(city.pop)

如果我这样做,MySQL将无法识别列名:

将忽略插入最大城市(stateID、largestCityPop、statePop) 选择stateID,MAX(city.pop)作为最大的citypop,state.pop FROM city 在city.stateID上加入state=按city.stateID在上加入state.ID组 重复键更新largestCityPop=city.largestCityPop

这是可行的,但看起来很难看:

将忽略插入最大城市(stateID、largestCityPop、statePop) 选择*FROM(选择stateID,MAX(city.pop)作为biggestCityPop, state.pop FROM city JOIN state on city.stateID=state.ID GROUP BY city.stateID)x在重复密钥更新最大城市IP上= 最大城市顶点


答案很好,但在我的实际案例中,这个问题不会得到解决。尽管如此,碰撞的可能性可以被认为是50/50。那么我应该选择什么呢?作为
插入。。。在重复密钥更新上
看起来“更好”,那么在哪些特定情况下“替换”是更好的选择?我已经做了相当多的研究,据我所知,没有共同的理由使用替换而不是插入。。。在重复密钥更新时。它本质上是一个遗留功能。除非您的代码依赖于删除的行是有特殊原因的