2014-07-15 110 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,因爲您解決了我的問題,現在我可以繼續進行這個小型項目!