2012-10-13 51 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帮助。 –

相关问题