SQL:INSERT(如果不存在)和UPDATE(如果存在)

时间:2016-06-20 10:52:50

标签: php mysql sql database insert

我有一个程序可以执行数据库的插入和更新,我从API获取数据。 这是我得到的样本数据:

$uname    = $get['userName'];
$oname    = $get['offerName'];
$visitdata= $get['visits'];
$convdata = $get['conversion'];

我将此数据保存到数据库sql。 (成功)这是一个样本:

$sql = "INSERT INTO data_tester(username_data, name_offer_data, visit_data, conversion_data) VALUES('$uname','$oname', '$visitdata', '$convdata')";
  

数据库表中的示例数据

id | username_data | name_offer_data | visit_data | conversion_data
1  | MOJOJO        | XXX AU          | 177        | 13
2  | MOJOJO        | XX US           | 23         | 4

现在,我想保存数据$uname, $oname, $visitdata, $convdata,如果不存在,请更新$visitdata, $convdata $uname, $oname如果EXIST

如何使用简单查询运行代码。 请举个例子。 谢谢。

4 个答案:

答案 0 :(得分:1)

您正在寻找的功能称为UPSERT,它是SQL-2008 Standard的一部分。然而,并非所有DBMS都实现它,有些实现它不同。

例如在MySQL上你可以使用:

INSERT ... ON DUPLICATE KEY UPDATE

语法(link to docs) 或

REPLACE INTO

语法(link to docs)。

这些方法要求您拥有一个合适的PRIMARY KEY :( username_data name_offer_data)。

如果您使用ActiveRecord(或类似)类,某些PHP框架也支持此功能。在Laravel中,它被称为updateOrCreate,在Yii中被称为save()。因此,如果您正在使用框架,请尝试检查其文档。

如果您既不使用框架也不使用现代DBMS,则必须自己实施该方法。运行SELECT count(*) from data_tester WHERE username_data = ? AND name_offer_data = ?,检查它是否返回任何行并调用适当的UPDATE / INSERT sql

答案 1 :(得分:0)

很简单,试试这个:

if(isset($get['userName'])){
$sql = "SELECT * FROM data_transfer WHERE userName = ".$userName.";";
$result = connection()->query($sql);
$rs = mysqli_fetch_array($result);
connection()->close();
    //if is not void, means that this username exists
if ($rs != ''){
    mysqli_free_result($result);
    //InsertData

}
else{
   mysqli_free_result($result);
    //UpdateData
}

* chech你必须在where子句上使用你的PrimaryKey,以确保只有一个。如果你使用了一个ID并且你没有通过$ _GET获得它,那么你必须修改一些内容以确保不重复的数据。例如,检查userName不能复制或类似的东西

答案 2 :(得分:0)

您只需使用替换为命令,而不是插入命令。

$sql = "REPLACE INTO data_tester(username_data, name_offer_data, visit_data, conversion_data) VALUES('$uname','$oname', '$visitdata', '$convdata')";

这是一个很好用的功能。我多次使用它。

答案 3 :(得分:0)

请确保列username_data上有唯一键,如果是这样,Mysql的ON DUPLICATE KEY UPDATE适用于这种情况,SQL语句就是这样:

$sql = "INSERT INTO data_tester(username_data, name_offer_data, visit_data, 
conversion_data) VALUES('$uname','$oname', '$visitdata', '$convdata')
ON DUPLICATE KEY UPDATE username_data = '$uname', name_offer_data = 
'$oname', visit_data = '$visitdata', conversion_data = '$convdata'"