mysql - 更新加入 -> 插入 NULL

标签 mysql sql sql-update left-join

这个问题很简单,但我通过搜索“UPDATE JOIN INSERT”和类似的东西找不到答案。

我需要两个表(“主”和“子”)的更新,而一个数据集可能不存在。那么应该有一个简单的 INSERT 执行之前...在一条语句中。

'main'总是存在的。
'sub' 没有。

我梦幻般的 SQL 解决方案是这个:

UPDATE main LEFT JOIN sub on main.primary=sub.primary
SET main.foo='bar', sub.foo2='bar2'
CASE sub.primary IS NULL {INSERT INTO sub SET sub.primary=main.primary};

“CASE”部分是自由式的,大概不会起作用。 但正确的做法是什么?

它绝对必须是“UPDATE [...] LEFT JOIN [...] SET a=aVal, b=bVal, [...]”- 语句。 它必须可以扩展到最多 5 个 LEFT JOIN 表,并且在没有“SET(..) VALUES(..)”的情况下工作

有什么可能的解决方案吗?

最佳答案

ON DUPLICATE KEY 可能是您最好的选择。
围绕以下内容:

INSERT INTO sub s (col1, col2, col3)
SELECT m.col1, m.col2, m.col3
FROM MAIN m
ON DUPLICATE KEY
UPDATE SET m.foo='bar', s.foo2='bar2'

如果您需要将左联接作为查询的一部分,只需将其添加到选择中,如下所示:

INSERT INTO sub s (col1, col2, col3)
SELECT m.col1, m.col2, m.col3
FROM MAIN m
LEFT JOIN sub s ON s.primary = m.primary
LEFT JOIN sub2 s2 ON s2.primary = m.primary
ON DUPLICATE KEY
UPDATE SET m.foo='bar', s.foo2='bar2', s.foobar = s2.foobar

关于mysql - 更新加入 -> 插入 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39335030/

相关文章:

SQL Server - 添加或减去先前的值

PHP 通过一次提交更新 MySQL 中的多行

Android SQLite更新语句

php - 使用字符串创建常量

mysql - 对来自不同表的同一查询中的两列求和

SQL:连接 3 个表,还需要将第 3 个表连接到自身

php - Mysql 查询更新行并使用相同的查询返回新值

java - 使用 Java 应用程序将电子邮件地址插入 MySQL

mysql - 如何按地址排序,地址的框架是cellname{p}#{q}T{r}

c# - 如何将 sql union 转换为 linq