PDO - 根据 3 个值检测到重复项时插入新行
PDO - Insert new row when duplicate detected based on 3 values
目前我 运行 SELECT
查询 table 并且如果 num_rows
为零,那么 运行 一个新函数 INSERT
s记录到table。这似乎非常低效,我正在努力寻找一个好的解决方案。
当前设置(简化):
Select函数-
$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";
}
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,col4
和 col6
方面是相同的
这似乎不是最有效的方法。有人遇到过这个吗?任何建议将不胜感激。
如果 col1
、col4
和 col6
的组合是唯一的——意味着它应该只出现一次,那么您可以使用 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
);
无论列是否需要唯一,这都有效。
目前我 运行 SELECT
查询 table 并且如果 num_rows
为零,那么 运行 一个新函数 INSERT
s记录到table。这似乎非常低效,我正在努力寻找一个好的解决方案。
当前设置(简化): Select函数-
$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";
}
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,col4
和 col6
这似乎不是最有效的方法。有人遇到过这个吗?任何建议将不胜感激。
如果 col1
、col4
和 col6
的组合是唯一的——意味着它应该只出现一次,那么您可以使用 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
);
无论列是否需要唯一,这都有效。