2016-06-20 249 views
0

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

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

我保存这些数据的数据库SQL。 (sucess)这是一个示例:

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如果不存在,UPDATE $visitdata, $convdata其中$uname, $oname是否存在

在数据库表

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

的样本数据

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

+0

那么首先你必须从塔的数据库获取数据,并检查数据是否存在,则进行更新否则执行插入查询 你必须使用插入,更新并为其选择查询。 –

+2

如果这是MySQL,请查看[insert into ... on duplicate key update](http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html)语法。 –

+0

阅读关于'MySQL on duplicate key' – sagi

回答

1

您正在寻找的是所谓的功能,它是SQL-2008标准的一部分。然而,并非所有的DBMS-S都实现它,有些实现它的方式不同。

例如在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

+0

是的,如何在username_data和name_offer_data中添加PRIMARY KEY? 我使用ID为主键,但没有得到它$ _GET – Zayn

+0

问题是你不能添加第二个主键(这就是为什么它被称为“主”)。不幸的是,你必须手工模拟PHPERT(发出SELECT,然后决定UPDATE/INSERT)。第二种选择是使用'ALTER TABLE data_tester DROP PRIMARY KEY'删除主键并添加一个新的'ALTER TABLE data_tester ADD PRIMARY KEY(username_data,name_offer_data)''但通常这是非常危险的并且有太多的副作用需要考虑它(例如更改所有外键) –

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 
} 

*再检查一下,你必须使用你的where子句,以确保只有这一个的PrimaryKey。如果你使用了一个ID,并且你没有通过$ _GET获取它,你将不得不修改一些东西来确保没有重复的数据。例如,检查该用户名不能重复或类似的

+0

是的,如何在username_data和name_offer_data中添加PRIMARY KEY?我使用ID作为主键,但没有得到它$ _GET – Zayn

+0

所以......如果你不能处理你的主要或唯一的东西,你想如何检查是否有重复的东西? :/ – JoelBonetR

+0

我不知道是否每个用户名只能有一个数据,或者每个都可以有N.如果我的用户名[dondregon]只能得到一个数据[181cm,darkhair,21cm],只需检查userName是否存在。如果你没有得到void,则执行更新,否则执行插入操作,但是必须将userName固定为唯一键。 – JoelBonetR

0

东西,你可以简单地使用更换成命令,而不是插入命令。

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

这是mysql的一个很好用的功能。我用过很多次。

0

请确保有上username_data列上的唯一关键,如果是MySQL的对重复密钥更新适用于这种情况下,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'" 
相关问题