mysql - 将 INSERT/DELETE/UPDATE 查询合并为一个

标签 mysql

我在我的应用程序中使用了一个名为 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/

相关文章:

php - Mysql查询: auto-increment manipulation and update on the foreign table

MySQL LIKE Query 5.1到5.6改成全表扫描

mysql - 在一个查询行中创建多个数据库

php - 类内 MySQL 连接问题

php - 何时何地打开数据库连接

mysql - 我可以在 ON DELETE CASCADE 之前使用程序存储历史日志吗

mysql - 在多个列中查找最高分

php - Yii2 事件记录中按查询等效的 MySQL 复杂顺序

mysql - 流量交换脚本数据库设计建议

php - 如何在mysql中按降序获取行?