ON DUPLICATE KEY忽略ID

时间:2014-07-15 10:52:24

标签: php mysql sql

我正在尝试对MySQL服务器执行INSERT以避免“读取”表两次,这就是我执行以下查询的原因:

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,没有人是唯一键或其中任何一个,如果它们?

2 个答案:

答案 0 :(得分: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;

请注意,您有一个多余的最终右括号。

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

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

答案 1 :(得分:0)

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

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

最后,我没有必要修改主键,到目前为止工作正常。

问题是我需要检查年份,星期,类型,行类型及其值是否相同,然后只更新该kpi的值:

ON DUPLICATE KEY UPDATE kpiValue = $ value

感谢一百万Gordon Linoff,因为你解决了我的问题,现在我可以继续这个迷你项目了!