【问题标题】:Check MySQL if data already exists, if not, INSERT. [PHP+jQuery Ajax]如果数据已经存在,请检查 MySQL,如果不存在,请插入。 【PHP+jQuery Ajax】
【发布时间】:2015-12-18 12:48:55
【问题描述】:

我无法创建将值插入 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();
?>

【问题讨论】:

  • 是的,您需要选择检查...完成
  • 使用INSERT ... ON DUPLICATE KEY UPDATE ...SELECTINSERT 快​​。我想发布我的完整答案 - @WilliamMadede 这不是重复的,你错了,请删除你的重复标志
  • @fred-ii 这不是该问题的重复,请删除您的重复标志
  • @notes-jj 再读一遍:“我需要额外的 'SELECT' 查询来检查值是否已经存在吗?” - 重复项。如果 OP 对副本有问题,则由那个人告诉我。他很可能参观了问答环节并想出了如何去做。如果 OP 没有回来并亲自告诉我我的关闭是一个错误的决定,我将重新打开。到那时,复制品就站着。
  • @Fred-ii-我在类似的帖子上查找了您的答案,我了解您是如何使用 SELECT 查询做到的,但是由于数组,我对每个循环都有,我无法执行 SQL SELECT 查询对于我数组中的每个元素?

标签: javascript php jquery mysql ajax


【解决方案1】:

使用ON DUPLICATE KEY UPDATE 功能。如果主键存在,它不会插入。但是你必须更新一些值,所以使用没有索引或索引最少的列 () 在你的情况下可能是结果)。您的主键必须从三个 FK 中提取出来:

ALTER TABLE `predictions` ADD PRIMARY KEY( `userFK`, `matchFK`, `tournamentFK`);

PHP 代码,只是 SQL 语句(我是 Java 专家,所以我尽力了)

$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-&gt;affected_rows

性能

INSERT ... ON DUPLICATE KEY UPDATE 肯定比 SELECTINSERT 快,但它比仅需要数据集的 INSERT 慢。更新是在数据库中完成的,即使它是相同的值。不幸的是,没有 ON DUPLICATE KEY UPDATE INGNORE。如果您有很多插入,这将导致更新,而不是使用缓存,在数组中查找值并在插入之前与数组进行比较可能会更好。仅使用 ON DUPLICATE KEY UPDATE 作为后备。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多