目前我在表上运行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,col4
和col6
这似乎不是最有效的方法。以前有人遇到过这个吗?任何建议都将不胜感激。
答案 0 :(得分:2)
如果col1
,col4
和col6
的组合意图是唯一的 - 意味着它只应出现一次,那么您可以使用{{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);
无论列是否必须是唯一的,这都将起作用。