2016-04-21 91 views
2

所以,我寫了一個SQL查詢,就像你一樣,而且我偶然發現了一個問題。我想要做的是在每次唯一用戶訪問特定頁面時在數據庫中發出查詢。獨特性通過session_id()完成,因爲這通常是相當可靠的。SQL查詢 - 插入但只有當記錄不存在時?

我想要的是一個SQL查詢,它將一行數據插入到兩列中,但只有在這兩列沒有相同的值時。

如果用戶x訪問的頁面命名page1,然後在數據庫中,它會記錄如下圖所示:

+------------+---------+ 
| page_name | user_id | 
+------------+---------+ 
| page1 | x | 
+------------+---------+ 

我將如何去寫一個查詢,檢查表格看,如果數據是插入將是重複的?

我當前的查詢如下(它只是一個標準插入查詢):

INSERT INTO `page_views` (`page_name`, `user_id`) VALUES ('.$pageName.', \''.session_id().'\') 
+0

檢查答案在這裏: - http://stackoverflow.com/questions/16460397/sql-insert-into-table-only-if-record-doesnt-exist –

+0

的[檢查是否行存在可能的複製,否則插入](http://stackoverflow.com/questions/639854/check-if-a-row-exists-otherwise-insert) – Raj

+1

[MySQL條件插入]的可能重複(http://stackoverflow.com/questions/913841/mysql-conditional-insert) –

回答

8

使用INSERT IGNORE,而不是INSERT。如果一條記錄沒有複製現有的記錄,MySQL會照常插入它。如果記錄是重複的,那麼IGNORE關鍵字告訴MySQL放棄它而不會產生錯誤。

以下示例不會出錯,並且不會插入重複記錄。

的語法很簡單 - 只需要添加「忽略」後,「插入」,像這樣:

INSERT IGNORE INTO mytable 
    (pk, f1, f2) 
VALUES 
    ('abc', 1, 2); 

插入多條記錄 當插入多發記錄一次,任何不能被插入不會,但任何可以是:

INSERT IGNORE INTO mytable 
    (pK, f1, f2) 
VALUES 
    ('abc', 1, 2), 
    ('def', 3, 4), 
    ('ghi', 5, 6); 

在上面的第二個例子,如果記錄已經存在了「ABC」和「高清」,那麼這兩個記錄將不能插入,但對於「GHI」記錄會。

+1

哦,直到現在我還沒有聽說過。這節省了我的方法額外的查詢,很酷! – RefreshCarts

+0

優秀的答案並解決問題。唯一的問題是,沒有錯誤產生,但它看起來好像在我的phpMyAdmin上使用SQL窗口時忽略'IGNORE'部分... –

0

使用select對數據庫執行檢查,看看它是否已經存在:)代碼示例如下。

$checkQuery = "SELECT page_name FROM page_views WHERE page_name='".$pageName."' AND user_id='".session_id()."'"; 
$checkResult = mysqli_query($DBLink, $checkQuery); 

    if (mysqli_num_rows($checkResult) != 0){ 
    // CODE FOR IF DUPLICATE FOUND 
    } else { 
    // NO DUPLICATE CODE GOES HERE 
    } 
+1

這會導致使用多個查詢,而不是一個查詢,是我試圖達到的目標。感謝您的貢獻。 –

+1

這很酷,我沒有聽說過插入忽略,直到今天,超過10年的PHP/MySQL,瘋狂嗯:) 感謝您的種類單詞,我將在未來的工作中使用INSERT IGNORE方法我自己現在也! – RefreshCarts