Mysql 无重复的SQL插入(无主键或唯一键) 让我考虑一下,我有一个表A用来生成表B。我没有主键或唯一的密钥,可以在重复的键< /代码>上使用。< /P>

Mysql 无重复的SQL插入(无主键或唯一键) 让我考虑一下,我有一个表A用来生成表B。我没有主键或唯一的密钥,可以在重复的键< /代码>上使用。< /P>,mysql,sql,insert,on-duplicate-key,Mysql,Sql,Insert,On Duplicate Key,我的表B有3列:A、B和C 仅当行不存在时,我才想插入该行。我可以确定行是否存在是A和B的组合。我在不存在的地方使用语句来执行此操作。 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有3列:A、B和C

仅当行不存在时,我才想插入该行。我可以确定行是否存在是A和B的组合。我在不存在的地方使用
语句来执行此操作。

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中不存在。

您应该在子查询中将外部查询中的列的别名作为前缀:

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
中的值进行比较(每一行都有自己的值),因此当您插入至少一行时,“没有与自身相等的行”的条件这从来都不是真的。

我认为最好、更快的方法是对a+B应用
唯一的
约束

Alter TABLE TableB ADD CONSTRAINT unique_A_B UNIQUE(A,B);
然后在重复密钥更新时使用

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

更新行的更新时间戳,为什么不使用
UNIQUE(a,B,C)
?@Fozi,因为a可以重复。B也可以重复,但只有两者的结合才是唯一的。这是我使用的数据的本质。Ant这正是
UNIQUE(A,B,C)
为您所做的;这与
UNIQUE(A)UNIQUE(B)UNIQUE(C)
不同。对不起,我误读了这个问题:它应该是
UNIQUE(A,B)
@Fozi我不知道。你说得很对。谢谢。不过这大大增加了我查询的执行时间(从大约0.1秒增加到>10秒)@Wistar当然增加了!在您的版本中,当
表B
中至少有一行时,
不存在
条件永远不会满足,并且只需
表B
中的一条记录即可使该条件失败。当您将其更改为正常工作(从外部查询检查表中的值)时,它必须检查所有行,并查看它们是否都没有相同的值-速度必须较慢(最好在
TableB.a
TableB.B
列上有一个复合索引)。正如@Fozi所建议的,可能使用
UNIQUE(a,B)
对表B进行约束,然后在重复密钥更新时使用
可能更符合性能要求。