【发布时间】:2020-09-24 14:58:46
【问题描述】:
我看到类似的问题被问了十几次,但都不是我的场景。
我的意图是根据 csv 导入的临时表 (table2) 更新当前表 (table1);
- 删除缺失的
appids - 添加新的
appids - 如果
name已更改,请更新
另外还有一个更新后的触发器(感谢我意识到我在做什么而不是简单地使用损坏的代码运行);
- 在历史记录表 (table3) 中记录更新
- 在历史记录表 (table3) 中记录删除
目前我执行如下操作:
CREATE TEMPORARY TABLE table2 (
appid INT,
name VARCHAR(255)
);
LOAD DATA LOCAL INFILE "outp.csv" INTO TABLE table2
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
UPDATE table1
INNER JOIN table2 ON table2.appid = table1.appid
SET table1.name = table2.name;
DROP TEMPORARY TABLE table2;
目前,每当我运行更新时,历史记录表都会获取所有现有行,而且不会导入新行,也不会删除丢失的行。
完成预期更新操作的正确方法是什么?
编辑:实际上,使用下面 GMB 提供的确切陈述更有意义。在我意识到插入语句的工作原理之后,避免运行第三条不必要的语句会更有意义,因为插入将同时执行插入和更新。
旧三语句脚本供参考:
DELETE FROM table1
WHERE NOT EXISTS(
SELECT 1
FROM table2
WHERE table2.appid = table1.appid
);
UPDATE table1 INNER JOIN table2 ON table2.appid = table1.appid
SET table1.name = table2.name
WHERE table1.name <> table2.name;
INSERT INTO table1 (appid, name)(
SELECT table2.appid, table2.name FROM table2
LEFT JOIN table1 ON table2.appid = table1.appid
WHERE table1.appid IS NULL
);
【问题讨论】:
-
你能简单地替换整个表吗?
标签: sql sql-update mariadb sql-insert load-data-infile