替换为查询语法

kfo*_*eck 42 mysql sql database replace

我希望能够使用"替换为"语句更新相同模式的表.最后,我需要能够使用可能已更改的值更新大型表.

这是我用来开始的查询:

REPLACE INTO table_name
(visual, inspection_status, inspector_name, gelpak_name, gelpak_location),
VALUES (3, 'Partially Inspected', 'Me', 'GP1234', 'A01');
Run Code Online (Sandbox Code Playgroud)

我不明白的是数据库引擎如何知道什么是重复行而哪些不是?这些数据非常重要,我不能冒数据被破坏的风险.它是否像"如果列出的所有列具有相同的值,它是重复的行"一样简单?

我只是想弄清楚这样做的有效方法,所以我可以在一分钟内更新> 45,000行.

Fil*_*lva 74

正如文件所说:

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

  • 请注意,"删除然后插入"可能非常慢 - 比SELECT后跟UPDATE或INSERT(取决于哪个)要慢得多.DELETE使索引无效.INSERT ... ON DUPLICATE UPDATE ...比REPLACE快一点,但仍比SELECT + UPDATE慢得多.无论如何,对我来说 - 衡量你的表现. (2认同)

And*_*unn 16

REPLACE确实工作就像INSERT覆盖具有相同PRIMARY KEYUNIQUE索引的记录一样,但要注意.

Shlomi Noach REPLACE INTO 在这里使用时写到了这个问题:

但是像我一样的弱心人应该意识到以下几点:这是一个重量级的解决方案.它可能正是您在易用性方面所寻求的,但事实是在重复键上执行DELETE和INSERT,这需要仔细研究.

每当删除一行时,所有索引都需要更新,最重要的是PRIMARY KEY.插入新行时,会发生同样的情况.特别是在InnoDB表上(由于它们的集群特性),这意味着很多开销.指数的重组是一项昂贵的操作.可能需要在DELETE时合并索引节点.由于INSERT,节点可能需要拆分.经过多次REPLACE INTO执行后,如果使用SELECT/UPDATE或INSERT INTO ...在DUPLICATE KEY上,最有可能的是你的索引比它本来更碎片化了

此外,还有"嗯,如果行不在那里,我们创造它.如果它在那里,它只是得到更新"的概念.这是错误的.该行不仅会更新,而是完全删除.问题是,如果该表上有PRIMARY KEY,并且REPLACE INTO没有为PRIMARY KEY指定值(例如,它是AUTO_INCREMENT列),则新行获取不同的值,这可能不是什么你在寻找行为.

REPLACE INTO的许多用途无意更改PRIMARY KEY(或其他UNIQUE KEY)值.在这种情况下,最好不要管它.在我看过的生产系统上,将REPLACE INTO更改为INSERT INTO ... ON DPLICATE KEY导致吞吐量增加10倍(以每秒查询数衡量)并且IO操作和负载平均值急剧下降.

总之,REPLACE INTO 可能适合您的实施,但您可能会发现使用它更合适(风险更小)INSERT ... ON DUPLICATE KEY UPDATE.