我在我的应用程序中使用了一个名为 t_media 的主表。数据集来自每天更新的外部来源。我每天将数据集下载到一个名为 t_media_temp 的临时表中。我需要做三件事:
- 将 t_media_temp 中的记录插入到 t_media 中(如果它不存在)
- 如果 t_media_temp 中的日期不同,则更新 t_media 中的记录
- 如果 t_media_temp 中不存在,则从 t_media 中删除记录
在目前的情况下,我使用下面的 3 个查询,但是有没有一种简单的方法可以将它们组合成一个查询?
/* Insert */
INSERT INTO t_media (`col_1`, `col_2`, `col_3`, `col_x`)
SELECT (`col_1`, `col_2`, `col_3`, `col_x`)
FROM t_media_temp AS t1
WHERE NOT EXISTS (
SELECT * FROM t_media AS t2
WHERE t1.col_1 = t2.col_1
)
/* Update */
UPDATE t_media, t_media_temp SET
t_media.col_1 = t_media_temp.col_1,
t_media.col_2 = t_media_temp.col_2,
t_media.col_3 = t_media_temp.col_3,
t_media.col_x = t_media_temp.col_x
WHERE
t_media.col_1 = t_media_temp.col_1
AND
t_media.col_2 != t_media_temp.col_2
/* Delete */
DELETE FROM t_media WHERE col_1 NOT IN ( SELECT col_1 FROM t_media_temp )
col_1 在表中始终是唯一值。
最佳答案
根据文档 https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
您可以像这样混合插入和更新:
INSERT INTO t_media (`col_1`, `col_2`, `col_3`, `col_x`)
SELECT (`col_1`, `col_2`, `col_3`, `col_x`)
FROM t_media_temp AS t1
ON DUPLICATE KEY UPDATE
t_media.col_2 = t1.col_2,
t_media.col_3 = t2.col_3,
t_media.col_x = t3.col_x
但是无法将 INSERT 或 UPDATE 与 DELETE 混合使用
关于mysql - 将 INSERT/DELETE/UPDATE 查询合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31630607/