我在创建将代码值插入MySQL数据库的PHP代码时遇到了麻烦,但前提是它们已经不存在了。
我使用$ .ajax类型POST将数组从javascript发送到PHP文件。
我是否需要额外的' SELECT'查询以检查值是否已存在?
PHP文件(Works,插入值):
<?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();
?>
答案 0 :(得分:2)
使用ON DUPLICATE KEY UPDATE
功能。如果主键存在,它将不会插入。但是你必须更新一些值,所以在你的情况下使用没有索引或索引最少的列()结果)。您的主键必须由三个FK组成:
ALTER TABLE `predictions` ADD PRIMARY KEY( `userFK`, `matchFK`, `tournamentFK`);
PHP-Code,只是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 ;";
要知道是否插入了查询,您必须查看受影响的行数:
查询后查看$conn->affected_rows
。
INSERT ... ON DUPLICATE KEY UPDATE
明确地比SELECT
和INSERT
快,但它比所需数据集的INSERT
慢。更新在数据库中完成,即使它是相同的值。不幸的是,没有 。如果你有很多插入,那将导致更新,而不是使用缓存,在数组中查找值并在插入之前与数组进行比较。仅使用ON DUPLICATE KEY UPDATE INGNORE
ON DUPLICATE KEY UPDATE
作为后备。