更新加入 - > INSERT ON NULL

时间:2016-09-05 17:04:22

标签: mysql sql sql-update left-join

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

我需要两个表('main'和'sub')的UPDATE,而一个数据集可能不存在。然后应该有一个简单的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,[...]” - Statement。 它必须可以扩展到最多5个LEFT JOIN表,并且可以在没有“SET(..)VALUES(..)”的情况下工作

有没有可能的解决方案?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

UPDATE语句可以修改存在的行。在无法添加新行。绝对。

INSERT语句可用于向表中添加行。绝对可以编写一个添加“缺失”行的语句。

但如果“它必须是一个UPDATE”语句来添加行,那么就没有解决方案。