3

我正在使用 PHP,我需要在 MySQL 数据库中插入一条新记录,或者如果它存在,只需更新它。我阅读了他们建议使用REPLACEor的几个答案INSERT...ON DUPLICATE KEY UPDATE,但是如果我很好理解,这两个选项意味着使用唯一字段或主键(唯一的)。在我的例子中,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”和“Result”可以有相同的值(例如,我可以有多个包含“American”(query1)和“Men”(query2)字段的记录和不同的结果。

目前在 PHP 中我正在使用:

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

它只是附加所有记录并创建一个巨大的数据库。但是我想要实现的是在整个组合 query1&query2&result 不存在的情况下添加一条新记录。否则我只想更新“时间戳”字段。

例如,如果我的 PHP 脚本产生以下数据:

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

并且数据库已经包含“American”&“Men”&“result2”的精确组合,那么只更新字段“timestamp”。否则,如果组合不同(例如“American”“Men”“result3),则将新记录添加到表中。

预先感谢您的帮助

4

3 回答 3

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在插入时使用以中止键违规插入并改为更新时间戳。

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()

$current_timestamp列表中的也是如此VALUES()......

于 2012-10-13T13:43:50.527 回答
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

于 2012-10-13T13:47:15.827 回答
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 中使用它来使查询在语法上正确。

于 2012-10-13T13:47:52.803 回答