2012-10-13 91 views
3

我正在使用PHP,我需要在MySQL數據庫中插入新記錄,或者如果它存在,只需更新它。我讀了幾個答案,他們建議使用REPLACEINSERT...ON DUPLICATE KEY UPDATE,但是如果我很好理解,這兩個選項意味着使用唯一字段或主鍵(這是唯一的)。在我的情況下,MySQL表有類似這樣的價值觀:替換MySQL中的現有記錄或創建沒有主鍵或唯一字段的新記錄

Timestamp   | Query1 | Query2 | Result 
-------------------------------------------------------- 
2012-10-13 08:15:27 | American | Men  | here result 

2012-10-13 08:15:23 | American | Men  | result2 

2012-10-13 08:15:27 | American | Women | other result 

2012-10-13 08:15:27 | German | Men  | here result 

所以我不能有主鍵或因爲「QUERY1」,「QUERY2」和「結果」 univoque字段可以有相同的值(例如,我可以有幾條記錄包含「美國」(QUERY1)和「男人」(QUERY2)和不同的結果更多的領域

在PHP中的那一刻我使用:

INSERT INTO results (Timestamp, Query1, Query2, Result) VALUES ('$current_timestamp', '$nationality', '$gender', '') 

剛剛追加的所有記錄並創建一個巨大的數據庫,但我想要實現的是添加一個新的記錄,只要是ent ire組合查詢1 &查詢2 &結果不存在。否則,我只想更新「時間戳」字段。

舉例來說,如果我的PHP腳本生成以下數據:

Timestamp   | Query1 | Query2 | Result 
2012-10-13 08:15:23 | American | Men  | result2 

和數據庫已經包含的「美國」 &「男人」 &「結果2」則只是場「時間戳」是這樣的精確組合更新。否則,如果該組合是不同的(例如,「美國」,「男性」,「result3)一個新的記錄添加到表中。

預先感謝您的幫助

回答

3

即使不在一個PRIMARY KEY柱像典型AUTO_INCREMENT整數,如果這三個列意味着是一個獨特的組合,你應該將其定義爲一個複合鍵,這樣不僅保持獨特性,但也對他們執行索引爲單位。

CREATE TABLE results (
    `Timestamp` DATETIME NOT NULL, 
    `Query1` VARCHAR() NOT NULL, 
    `Query2` VARCHAR() NOT NULL, 
    `Result` VARCHAR() NOT NULL, 
    /* Composite key across three columns */ 
    PRIMARY KEY (`Query1`,`Query2`,`Result`) 
); 

您可能然後在插入時使用ON DUPLICATE KEY UPDATE來中止關鍵違規和u的插入改爲更新時間戳。

INSERT INTO results (
    Timestamp, 
    Query1, 
    Query2, 
    Result 
) VALUES (
    '$current_timestamp', /* see note below about NOW() */ 
    '$nationality', 
    '$gender', 
    '' 
) ON DUPLICATE KEY UPDATE `Timestamp` = '$current_timestamp'; 

注意:我們假設PHP變量已被正確轉義。注2:如果$current_timestamp的值確實是當前時間戳而不是某個存儲值,那麼我推薦使用MySQL的NOW()函數,而不是傳入PHP變量。

ON DUPLICATE KEY UPDATE `Timestamp` = NOW() 

也是一樣的VALUES()列表中$current_timestamp ...

+0

沒有意識到時間戳應該更新 – davidkonrad

0

您可以使用條件插入像這樣的:

INSERT INTO results (Timestamp, Query1, Query2, Result) 
SELECT '$current_timestamp', '$nationality', '$gender', '$result' 
    FROM DUAL 
    WHERE NOT EXISTS (SELECT * FROM results 
         WHERE Query1 = '$nationality' 
          AND Query2 = '$gender' 
          AND Result = '$result') 

dual最初是在Oracle引入了一個特殊的一列的表

來源:http://en.wikipedia.org/wiki/DUAL_table

0

您可以使用「WHERE NOT EXISTS'條款,如下所示:

INSERT INTO results (Timestamp, Query1, Query2, Result) 
SELECT '$current_timestamp', '$nationality', '$gender', '$result' 
FROM Dual 
WHERE NOT EXISTS (SELECT * 
    FROM results 
    WHERE Query1 = '$nationality' 
    AND Query2 = '$gender' 
    AND Result = '$result' 
) 

這裏Dual是一個存根/假表,只能在mysql中使用,以使查詢在語法上正確。

+0

-1,你在第二行有語法錯誤,你的答案與我的答案有什麼不同? – haynar

+0

我只是想幫忙,是的,我們來到了相同的解決方案,因爲它是最明顯的解決方案。現在,如果它讓你的一天倒下了我,對你有好處,我很好。 – mbarthelemy

+0

+1幫助。 –

相關問題