MySQL "UPSERT" 并删除不受影响的行

MySQL "UPSERT" and delete not affected rows

我在 MySQL 中有一个 table,每晚都会使用 cron 任务更新。 每一行都被更改了,因为我从 XLS 文件中获取数据并且必须更新所有值。

起初我的问题是是否值得更新每一行,或者另一方面只是删除所有并重新插入。我坚持使用 UPSERT 方法,因为我读到它比丢弃所有数据更充分、更快甚至更优雅,但如果我错了请纠正我。

好吧,所以现在我的问题是关于不是新行并且每次 cron 运行时都不会更新的行。 XLS可能没有固定的长度,所以有一天可能会少几行......或更多。

如何删除同一 "UPSERT" 语句中的那些行?

编辑: 我意识到也许 在这种情况下 最好删除旧数据并重新添加它们,尽管起初我的目标是避免这样做。

既然每次都更新了所有行,那么您无法检查未更改的行? 简单地截断并全部插入怎么样?

下面是比 DROPping 或 TRUNCATEing 更好的方法。这是因为停机时间为零。

CREATE TABLE new LIKE real;
LOAD DATA or otherwise do bulk INSERT into `new`
RENAME TABLE real TO old, new TO real;
DROP TABLE old;

我想交给 old 直到我有机会验证批量加载没有以某种方式搞砸和丢失所有东西。

唯一一次 table 被阻塞是在 RENAME 期间,但这太快了,我说 "zero downtime"。