2016-06-20 204 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'" 
相關問題