2016-04-21 118 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