2012-12-12 43 views
0

我有一個使用EVENT SCHEDULER更新數據庫的查詢。它應該每天更新一次數據。我的問題是,如果記錄存在,我無法更新它,除非我創建了UNIQUE INDEX,因爲域每個月都會重複一次,所以我無法做到這一點。在重複項目上重複更新

INSERT INTO f_s.s_d_s_tab(month,count_per_month,updated) 
SELECT * FROM 
(
SELECT 
DATE_FORMAT(`FE`,'%m') AS Month, COUNT(FE) AS FirstCount, domain 
FROM rets 
GROUP BY DATE_FORMAT(`FE`,'%m'), domain 
ORDER BY domain, Month ASC 
) a 
ON DUPLICATE KEY UPDATE count_per_month = a.FirstCount, updated = NOW(); 

記錄顯示,像這樣

Domain Month coun_per_month 
dom1  01  50 
dom1  02  90 
dom1  03  34 
dom2  01  12 
dom2  02  99 
dom2  03  80 

等....

我能做些什麼來讓它插入新域,但更新舊的。

+1

'UNIQUE(Domain,Month)'? – Wrikken

+0

我會使用'... UPDATE count_per_month = VALUES(count_per_month)...'來引用已經插入的值。 SELECT中的列似乎不與INSERT上的列名「對齊」。 (看起來'domain'正在被放入'updated'列 – spencer7593

回答

2

我的問題是,我不能讓它更新,如果記錄存在,除非我創建UNIQUE INDEX,我不能做,因爲域重複每個月。

當然,你可以 - 做一個multi-column唯一索引,在域名和月。

+0

所以基本上如果域和月份是唯一的,它會插入,否則它會更新? –

+0

是的,這是正確的。 – ceejayoz

1

它看起來不像SELECT列表中的列與INSERT列表中的列「排隊」。

INSERT INTO f_s.s_d_s_tab(domain, month, count_per_month, updated) 
SELECT a.* 
    FROM (
     SELECT r.domain     AS domain 
       , DATE_FORMAT(r.`FE`,'%m') AS month 
       , COUNT(r.FE)    AS count_per_month 
       , NOW()     AS updated 
      FROM rets r 
      GROUP 
      BY DATE_FORMAT(r.`FE`,'%m') 
       , r.domain 
      ORDER BY r.domain ASC, r.month ASC 
     ) a 
    ON DUPLICATE KEY 
UPDATE count_per_month = VALUES(count_per_month) 
    , updated   = VALUES(updated) 

產生「重複鍵」條件得到更新操作,你需要定義ON f_s.s_d_s_tab (domain, month) UNIQUE約束(或主鍵)。