目前我对表运行SELECT
查询,如果num_rows
为零,则运行一个新函数,将记录INSERT
到表中。这似乎很无辜,我正在努力寻找一个好的解决方案。
当前设置(简化):选择功能 -
$sql = "SELECT * FROM myTable WHERE col1 = ".$val1." AND col4 = ".$val4." AND col6 = ".$val6
// rest of code returns $numRows variable
如果未0
$numRows
,则运行新查询以插入新记录。
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,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
);
无论列是否需要唯一,这都将起作用。