让我们考虑一下我用表A来生成表B.我没有可用于ON DUPLICATE KEY
的主键或唯一键。
我的表B有3列:A,B和C.
我希望INSERT
只有在行已经不存在的情况下才会这样做。我可以确定该行是否存在是A和B的组合。我使用WHERE NOT EXISTS
语句来执行此操作。
INSERT INTO TableB
(A, B, C)
SELECT
SUM(A),
SUM(B),
SUM(C)
FROM TableA
WHERE NOT EXISTS (SELECT * FROM TABLE B WHERE A=A AND B=B)
GROUP BY A, B
如果表B为空,则插入行。但是,只要表B有记录,即使表B中不存在行,也不会插入任何行。
答案 0 :(得分:5)
您应该在外部查询中使用别名在子查询中添加前缀:
INSERT INTO TableB (A, B, C)
SELECT
SUM(A),
SUM(B),
SUM(C)
FROM TableA ta
WHERE NOT EXISTS (SELECT * FROM TableB tb WHERE tb.A=ta.A AND tb.B=ta.B)
GROUP BY A, B
您编写它的方式是,您将表TableB
中的值与来自TableB
的值(每行与自身)进行比较,因此当您插入至少一行时,条件是“有没有与自己相等的行“从来都不是真的。
答案 1 :(得分:1)
我认为最好和更快的方法是在A + B上应用UNIQUE
约束。
Alter TABLE TableB ADD CONSTRAINT unique_A_B UNIQUE(A,B);
然后使用ON DUPLICATE KEY UPDATE
:
INSERT INTO TableB (A,B,C)
SELECT
SUM(A),
SUM(B),
SUM(C)
FROM TableA
GROUP BY A, B
ON DUPLICATE KEY UPDATE C=SUM(C);
出于示例目的,我更新了C
,但我想在实际情况下,您希望使用Now()
更新行的更新时间戳。