SQL INSERT没有重复(没有主键或唯一键)

时间:2013-11-06 21:35:52

标签: mysql sql insert on-duplicate-key

让我们考虑一下我用表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中不存在行,也不会插入任何行。

2 个答案:

答案 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()更新行的更新时间戳。

相关问题