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

PDO - Insert new row when duplicate detected based on 3 values

目前我 运行 SELECT 查询 table 并且如果 num_rows 为零,那么 运行 一个新函数 INSERTs记录到table。这似乎非常低效,我正在努力寻找一个好的解决方案。

当前设置(简化): Select函数-

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

如果没有 $numRows0 那么 运行 插入新记录的新查询。

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";
}

Table结构:

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

方面是相同的

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

如果 col1col4col6 的组合是唯一的——意味着它应该只出现一次,那么您可以使用 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);

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

您还可以这样做:

INSERT INTO myTable(col1, col2, col3, col4, col4, col6, col7)
    SELECT :val1, :val2, :val3, :val4, :val5, :val6, :val7
    FROM dual
    WHERE NOT EXISTS (SELECT 1
                      FROM myTable t2
                      WHERE t2.col1 = :val1 and t2.col4 = :val4 and t2.col6 = :val6
                     );

无论列是否需要唯一,这都有效。