Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 替换MySQL中的现有记录或创建新记录而不使用主键或唯一字段_Php_Mysql - Fatal编程技术网

Php 替换MySQL中的现有记录或创建新记录而不使用主键或唯一字段

Php 替换MySQL中的现有记录或创建新记录而不使用主键或唯一字段,php,mysql,Php,Mysql,我正在使用PHP,我需要在MySQL数据库中插入一条新记录,或者如果它存在,只需更新它即可。我阅读了一些答案,其中他们建议在重复密钥更新时使用REPLACE或INSERT…,但是如果我理解清楚,这两个选项意味着使用唯一字段或主键(它们是唯一的)。在我的例子中,MySQL表的值与此类似: Timestamp | Query1 | Query2 | Result ------------------------------------------------------

我正在使用PHP,我需要在MySQL数据库中插入一条新记录,或者如果它存在,只需更新它即可。我阅读了一些答案,其中他们建议在重复密钥更新时使用
REPLACE
INSERT…
,但是如果我理解清楚,这两个选项意味着使用唯一字段或主键(它们是唯一的)。在我的例子中,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
因此,我不能有主键或univoque字段,因为“query1”、“query2”和“Result”可以有相同的值(例如,我可以有多个记录,其中更多字段包含“American”(query1)和“Men”(query2)以及不同的结果)

目前在PHP中,我正在使用:

INSERT INTO results (Timestamp, Query1, Query2, Result) VALUES ('$current_timestamp', '$nationality', '$gender', '')
它只是附加所有记录并创建一个巨大的数据库。但是我想要实现的是,如果整个组合query1&query2&result不存在,就添加一个新记录。否则,我只想更新“timestamp”字段

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

Timestamp            | Query1   | Query2   | Result
2012-10-13 08:15:23  | American | Men      | result2
并且数据库已经包含了“美国人”、“男人”和“结果2”的精确组合,然后只更新“时间戳”字段。否则,如果组合不同(例如“美国人”“男人”“结果3”),则会向表中添加一条新记录


提前感谢您的帮助

即使缺少一个
主键
列,比如典型的
自动增量
整数,如果这三列是唯一的组合,您应该将它们定义为复合键。这不仅可以保持唯一性,还可以将它们作为一个单元进行索引

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`)
);
然后,您可以使用when insert中止密钥冲突的插入,并更新时间戳

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\u timestamp
的值确实是当前时间戳,而不是某个存储值,我建议使用MySQL的
NOW()
函数,而不是传入PHP变量

ON DUPLICATE KEY UPDATE `Timestamp` = NOW()

VALUES()
列表中的
$current\u timestamp
也是如此…

您可以像这样使用条件插入:

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中引入的一种特殊的单列表


来源:

您可以使用“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'
  )

这里是一个存根/假表,您可以在mysql中使用它,仅用于使查询语法正确。

-1,您在第二行有语法错误,您的答案与我的有什么不同?我只是想提供帮助,是的,我们找到了相同的解决方案,因为它是最明显的一个。现在,如果这让您有机会否决我,那对您有好处,我我同意。