在插入重复项之前,我正在尝试检查表中是否已经存在Id。
因此,我需要检查数据库的表中是否存在Id,如果它存在,则什么也不做。否则,我想将记录插入表中。我该怎么做?
除此之外还有其他方法吗:
Sql_query->Select id from table where key="something";
If(true)
{
do nothing;
}
else
{
Insert record in database;
}
我想避免这种情况,因为搜索整个表然后插入需要时间那么有什么可行的方法吗?
两种策略:
- 让数据库执行此任务。改变你的表,使你想要唯一的字段实际上是一个唯一的索引。当您想要插入数据时,如果它是重复的,您会收到一个错误,可以用来决定下一步要做什么。或者,如果需要,您可以使用
ON DUPLICATE KEY
来执行另一个表操作 - 查询该表以了解id是否已经存在。如果没有,请生成插入
示例:
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$result = $mysqli->query("SELECT id FROM yourtable");
if ($result->num_rows > 0) {
/* do your insert */
}
$result->close();
我更喜欢让数据库来做这项工作。
更新:
根据要求,这里有两个关于如何向表添加唯一索引的示例。SQL看起来像这样:
CREATE UNIQUE INDEX your index_name
ON your_table (your_id_field);
在插入数据时,如果密钥已经存在,mysql将抛出一个错误。要处理此错误,请执行以下操作:
$SQL = 'INSERT INTO yourtable (yourfield1, yourfield2)
VALUES ( 1, "Hello")';
$result = $mysqli->query($SQL);
if (!mysqli_query($link, $SQL)) {
if(mysqli_errno($link) == 1062) {
/* duplicate ... whatever you want in this case */
}
}
当然,如果你不想在这种情况下做任何事情,你就不需要所有这些错误处理。
您可以使用以下代码来完成此操作:
<?php
if($stmt = $db->prepare("SELECT * FROM tablename WHERE id=?")){
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->store_result();
if($stmt->num_rows == 0){
// CREATE RECORD
}
}
?>
您只需要在表中搜索并检查查询是否返回
在列上创建唯一索引(如果不检查主键),并在创建SQL查询时使用ON DUPLICATE
。更多信息:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html