3

假设我有一个用于生成表 B 的表 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 中不存在行,也不会插入任何行。

4

2 回答 2

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(每一行与其自身)中的值进行比较,因此当您插入至少一行时,“没有与其自身相等的行”的条件永远不会成立。

于 2013-11-06T21:38:29.363 回答
1

我认为最好和更快的方法是UNIQUE在 A + B 上应用约束。

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().

于 2013-11-07T16:28:17.423 回答