2013-06-29 42 views
0

我试图检查如果一个Id已经存在于表中,我插入重复之前。如何检查一个值是否已经存在,以避免重复?如果它存在,然后什么都不做,否则插入记录到数据库

因此,我需要检查数据库表的存在的Id,如果它存在,然后什么也不做,否则我想插入记录到表中。我怎样才能做到这一点?

是否有除了这个其他任何方式:

Sql_query->Select id from table where key="something"; 

If(true) 
{ 
    do nothing; 
} 
else 
{ 
    Insert record in database; 
} 

我想避免这种情况,因为它需要时间来搜索整个表格,然后插入。那么有没有可行的办法?

+0

从ID匹配的数据库中选择所有,并检查返回的行数是否为0。 – luk2302

+1

请参阅插入IGNORE – Strawberry

+0

@Strawberry:Id不是主键。所以我不能使用INSERT IGNORE。 – Ponting

回答

4

两种策略:

  1. 让数据库执行此任务。改变你的桌子,所以你想要独特的领域实际上是一个unique index。当你想插入数据,并且它是重复的,你会收到一个错误,可以用来决定下一步该做什么。或者,如果您想要执行另一个表操作(如果需要),则可以使用ON DUPLICATE KEY
  2. 查询表格以确定是否存在该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 */ 
    } 
} 

你并不需要所有这些错误处理,如果你不想在这种情况下,当然做任何事情。

+0

谢谢你的回答。请看我更新的问题。 – Ponting

+0

我的答案中未涵盖哪些更新内容? – Bjoern

+0

哦是的..我看到第一个选项是我的答案。但是你能解释第一个选项与细节。我不想使用ON DUPLICATE KEY,因为我不想更新。我想在改变查询时使用唯一的关键字。可以请您详细描述一下或者用example.Thank。 – Ponting

2

你可以做到这一点与下面的代码:

<?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 
    } 
    } 
?> 

你只需要在表格中进行搜索,并检查查询返回的东西

+0

谢谢你的回答。请看我更新的问题。 – Ponting

+0

如果你打算为人们提供mysql_ *代码,至少应该使用正确的转义来防止注入,并且不要传递错误的代码。 – Prix

+0

@Prix你是正确的改变我的代码。 –

相关问题