2014-07-15 85 views
0

我试图执行INSERT到MySQL服务器,以避免“读书”表的两倍,这就是为什么我做了以下查询:对重复键忽略ID

INSERT INTO dailykpi 
(
    kpiType, 
    kpiRowType, 
    kpiRowTypeValue, 
    kpiYear, 
    kpiWeek, 
    kpiValue 
) 
VALUES 
(
    $kpiType, 
    $kpiRowType, 
    $sat, 
    $currentYear, 
    $currentWeek, 
    $value 
) 

如果注册表已经存在(它会每天到一个星期结束),我更新的值:

INSERT INTO dailykpi 
(
    kpiType, 
    kpiRowType, 
    kpiRowTypeValue, 
    kpiYear, 
    kpiWeek, 
    kpiValue 
) 
VALUES 
(
    $kpiType, 
    $kpiRowType, 
    $sat, 
    $currentYear, 
    $currentWeek, 
    $value 
) 
ON DUPLICATE KEY UPDATE 
    kpiType = $kpiType, 
    kpiRowType = $kpiRowType, 
    kpiRowTypeValue = $sat, 
    kpiYear = $currentYear, 
    kpiWeek = $currentWeek, 
    kpiValue = $value 

但它仍然插入重复条目。我猜是因为我的auto_increment ID列,这总是不同的,但我想以及如此微不足道的SQL,所以也许我失去了一些东西。

任何帮助,欢迎提前致谢!

编辑:我忘了提及该ID是一个auto_incrementable INT PRIMARY KEY,其余列是INT(一个外键),其中一个是FLOAT,没有人是唯一键或任何这些,他们应该?

+1

什么组合的列包含一个独特的集?所有这些(除了自动增量)?您需要在这些列上创建一个'UNIQUE INDEX'。 –

回答

0

您所查询的是:

INSERT INTO dailykpi(kpiType, kpiRowType, kpiRowTypeValue, kpiYear, kpiWeek, kpiValue) 
    VALUES ($kpiType, $kpiRowType, $sat, $currentYear, $currentWeek, $value) 
    ON DUPLICATE KEY UPDATE kpiType=$kpiType, kpiRowType=$kpiRowType, 
          kpiRowTypeValue=$sat, kpiYear=$currentYear, 
          kpiWeek=$currentWeek, kpiValue=$value; 

注意你有一个最终的右括号,这是多余的。

为此,您需要一个唯一的索引/约束来定义重复键。例如,您可能每kpiYear,kpiWeekpkiType有一行。如果是这样,您可以创建唯一索引:

create unique index idx_dailykpi_3 on dailykpi(kpiYear, kpiWeek, kpiType); 
+0

我忘了删除括号,它来自php代码,对不起。 我试过这个,但它只是插入了几行,所以我将kpiValue添加到了唯一索引中,因为实际上我每天要做的是检查kpiRow,kpiRowValue,Year和Week是否有值并更新值。如果它不存在,则插入完整的行。我不知道为什么它不能正常工作:S 感谢百万 – Zoudan

+0

@Zoudan。 。 。使用'重复密钥更新'时,最好只有一个唯一索引。删除第一个索引并只使用你真正想要的索引。 –

+0

非常感谢,但仍然怀疑......如果我删除主键实际上没有问题,因为我没有使用它作为来自其他表的外键,但我应该建立哪一个唯一索引?我认为我的大脑开始短路,如果这是一个愚蠢的问题,那么很抱歉。 – Zoudan

0

我解决它通过定义一个唯一索引:

上dailykpi创建唯一索引idx_dailykpi_5(kpiYear,kpiWeek,kpiType,kpiRowType,kpiRowTypeValue);

最后我没有修改主键,到目前为止按预期工作。

的事情是,我需要检查,如果这一年中,周,类型,行和其价值的类型是相同的,然后就更新KPI值:

对重复密钥更新kpiValue = $ value

感谢百万Gordon Linoff,因为您解决了我的问题,现在我可以继续进行这个小型项目!