我在创建将值插入 MySQL 数据库的 PHP 代码时遇到问题,但前提是这些值尚不存在。
我使用 $.ajax 类型 POST 将数组从 javascript 发送到 PHP 文件。
我是否需要额外的“SELECT”查询来检查值是否已存在?
PHP 文件(有效,插入值):
<?php
SESSION_START();
include('config.php');
if(isset($_POST['predictedMatches'])&&$_SESSION['userid']){
$predictedMatches=$_POST['predictedMatches'];
$userid=$_SESSION['userid'];
}else die("ERROR");
$sql="";
foreach($predictedMatches as $predictedMatch){
$sql.="INSERT INTO predictions(result,userFK,matchFK,tournamentFK) VALUES('".$predictedMatch['result']."','".$userid."','".$predictedMatch['id']."','".$predictedMatch['tourid']."');";
}
if($conn->multi_query($sql) === TRUE){
echo "OK";
}else{
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>
最佳答案
使用重复 key 更新
功能。如果主键存在,则不会插入。但是您必须更新一些值,因此请使用没有索引或最少索引的列(在您的情况下可能会导致结果)。您的主键必须由三个 FK 组成:
ALTER TABLE `predictions` ADD PRIMARY KEY( `userFK`, `matchFK`, `tournamentFK`);
PHP代码,只是SQL语句(我是Java Guy,所以我尽力了)
$sql.="INSERT INTO predictions (result, userFK, matchFK, tournamentFK) "
."VALUES('".$predictedMatch['result'] ."','".$userid."','"
.$predictedMatch['id']."','".$predictedMatch['tourid']."') "
."ON DUPLICATE KEY UPDATE result = result ;";
要知道查询是否已插入,您必须查看受影响的行数:
- 1 行 - 插入
- 2 行 - 更新
查看查询后的 $conn->affected_rows
。
性能
INSERT ... ON DUPLICATE KEY UPDATE
绝对比 SELECT
和 INSERT
更快,但比 INSERT< 慢
只是所需的数据集。更新是在数据库中完成的,即使是相同的值。不幸的是,没有。如果您有大量插入,这将导致更新,那么最好使用缓存,在数组中查找值并在插入之前与数组进行比较。仅使用ON DUPLICATE KEY UPDATE IGNORE
ON DUPLICATE KEY UPDATE
作为后备。
关于javascript - 检查MySQL数据是否已存在,如果不存在则INSERT。 [PHP+jQuery Ajax],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34356091/