PDO - 根据3个值检测到重复时插入新行

时间:2015-01-10 15:54:55

标签: php mysql sql pdo

目前我在表上运行SELECT查询,如果num_rows为零,则运行一个新函数,INSERT将记录放入表中。这似乎非常有用,我正在努力找到一个好的解决方案。

当前设置(简化): 选择功能 -

$sql = "SELECT * FROM myTable WHERE col1 = ".$val1." AND col4 = ".$val4." AND col6 = ".$val6
// rest of code returns $numRows variable 

如果$numRows没有0,则运行插入新记录的新查询。

if($numRows == 0) {
    try {
        $dbh = $this->_dbSite;
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $stmt = $dbh->prepare("INSERT INTO myTable (col1, col2, col3, col4, col4, col6, col7) VALUES (:val1, :val2, :val3, :val4, :val5, :val6, :val7");
        $stmt->bindParam(':val1', $val1, PDO::PARAM_STR);
        $stmt->bindParam(':val2', $val2, PDO::PARAM_STR);
        $stmt->bindParam(':val3', $val3, PDO::PARAM_STR);
        $stmt->bindParam(':val4', $val4, PDO::PARAM_STR);
        $stmt->bindParam(':val5', $val5, PDO::PARAM_STR);
        $stmt->bindParam(':val6', $val6, PDO::PARAM_STR);
        $stmt->bindParam(':val7', $val7, PDO::PARAM_STR);
        $stmt->execute();
    } catch (PDOException $e) {
        return $e->getMessage();
    }
} else {
    $message = "Sorry this record already exists";
}

表格结构:

col1   | col2 | col3 | col4 | col5 | col6 | col7
________________________________________________
user1    abc    sol    red    doo     3a    def
user2    abc    ast    Blue   doo     4a    def
user1    abc    ast    blue   doo     3a    def
user4    abc    ast    red    doo     6a    def
user1    abc    ast    Green  doo     3a    def
user2    abc    ast    red    doo     7a    def
user1    abc    ast    red    doo     3a    def

应避免使用上述示例,因为第一行和最后一行在col1,col4col6

方面相同

这似乎不是最有效的方法。以前有人遇到过这个吗?任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:2)

如果col1col4col6的组合意图是唯一的 - 意味着它只应出现一次,那么您可以使用{{1}执行此操作和唯一索引:

insert on duplicate key update

更新部分是无操作 - 它只是防止错误返回。

你也可以这样做:

CREATE INDEX idx_myTable_col1_col4_col6 on (mytable, col1, col4, col6)

INSERT INTO myTable(col1, col2, col3, col4, col4, col6, col7)
    VALUES (:val1, :val2, :val3, :val4, :val5, :val6, :val7)
    ON DUPLICATE KEY UPDATE col1 = VALUES(col1);

无论列是否必须是唯一的,这都将起作用。