我正在尝试对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,没有人是唯一键或其中任何一个,如果它们?答案 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;
请注意,您有一个多余的最终右括号。
为此,您需要一个唯一的索引/约束来定义重复键。例如,您可能每kpiYear
,kpiWeek
和pkiType
有一行。如果是这样,您可以创建唯一索引:
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,因为你解决了我的问题,现在我可以继续这个迷你项目了!