MySql INSERT忽略DISTINCT选择

时间:2014-10-15 13:22:05

标签: mysql sql

我有一个包含1列的简单表,我尝试使用INSERT和SELECT的查询插入一些东西。

INSERT INTO workloadtable (test)
  SELECT DISTINCT a.test FROM runtable a 
    WHERE a.test = "awesome_testcase"
    AND NOT EXISTS(SELECT b.test FROM workloadtable b WHERE b.test = a.test)

现在我遇到的问题是这个查询会插入' runtable'中出现的所有4000多个测试用例。它忽略了DISTINCT语句。我还尝试删除DISTINCT并在WHERE语句后添加GROUP BY a.test。

如果我只运行SELECT查询,我只得到一个结果,在这种情况下是" awesome_testcase"当我把它放在INSERT语句中时,我不知道为什么它的行为会有所不同。

我还想提一些其他的事情。我在上面使用phpMyAdmin在Linux机器上提到的查询运行。我尝试使用相同的数据库在Windows机器(没有phpMyAdmin)上完全相同的查询,它工作正常...只插入一行,而不是4000。 如果我将列设置为主键,我在尝试查询时显然会出错。这在Windows机器上不会发生。

我确信我在这里遗漏了一些东西,但我无法弄清楚是什么。

编辑:

以不同的方式尝试这个问题 - 同样的问题

insert into workloadtable (test)
select distinct a.test from runtable a 
    where a.test = "ST.WORKLOAD.REL.THN"
    and 0 = (select count(b.test) from workloadtable b where b.test = a.test)

EDIT2:

MySql版本在机器上不一样。 Linux运行5.5和Windows 5.6。无法改变版本,因为这会使其他事情变得复杂。

我也尝试使用控制台而不是phpMyAdmin UI,问题仍然存在。

2 个答案:

答案 0 :(得分:1)

构建临时表以解析查询中的圆圈:

CREATE TEMPORARY TABLE myTemp
  (SELECT DISTINCT a.test as test FROM runtable a 
  WHERE a.test = "awesome_testcase"
  AND NOT EXISTS(SELECT b.test FROM workloadtable b WHERE b.test = a.test));

INSERT INTO workloadtable (test)
SELECT test FROM myTemp

DROP TEMPORARY TABLE myTemp

答案 1 :(得分:0)

MySQL中存在一个错误,您插入的表格也在not exits子句中。

您可以使用left join代替not exits来解决此问题。这通常会导致更快的执行时间。

INSERT INTO workloadtable (test)
SELECT DISTINCT a.test
FROM runtable a 
  LEFT JOIN workloadtable b on b.test = a.test
WHERE a.test = "awesome_testcase"
AND b.test IS NULL