插入前检查重复项

时间:2011-10-10 21:42:19

标签: php mysql duplicates

在插入数据库之前,我使用以下代码检查重复项。对我而言,namedescriptionpricecityenddate匹配时,副本仅被视为重复。

foreach($states_to_add as $item) {
    $dupesql = "SELECT 
                    COUNT(*) 
                FROM 
                    table 
                WHERE 
                    (   
                        name = '$name' 
                        AND description = '$description' 
                        AND manufacturer = '$manufacturer' 
                        AND city ='$city' 
                        AND price = '$price' 
                        AND enddate = '$end_date'
                    )";

    $duperaw = mysql_query($dupesql);

    if($duperaw > 0) {
        echo nl2br("$name already exists in $city \n");
    } 
    else {
        $sql = "INSERT INTO table (..... (here go the values to be inserted)
        ....

在运行此检查之前定义每个值,我的结果总是在项目已存在时返回。我倾倒了“dupesql”并将命令复制/粘贴到phpmyadmin中,后者返回计数0.

7 个答案:

答案 0 :(得分:15)

您想要执行以下操作:

$dupesql = "SELECT * FROM table where (name = '$name' AND description = '$description' AND manufacturer = '$manufacturer' AND city ='$city' AND price = '$price' AND enddate = '$end_date')";

$duperaw = mysql_query($dupesql);

if (mysql_num_rows($duperaw) > 0) {
  //your code ...
}

有关详细信息,请参阅Here

答案 1 :(得分:6)

我认为你的问题可分为两部分。为什么我的PHP代码不起作用?我不知道,不知道PHP和其他人似乎刚刚回答:-)。第二个问题是我如何检查重复?你正在以完全错误的方式检查重复。

在桌面上创建unique index / primary key。然后,当您尝试插入数据库时​​,如果存在重复,则会抛出错误。捕获错误并按照您的需要处理它。计算记录数绝对是错误的方法,并且会严重损害您的代码速度。

答案 2 :(得分:1)

您仍然可以遇到2个用户同时尝试插入重复项的竞争条件,同时使用select语句检查重复项,这样两个用户都可以继续插入记录。我更喜欢在数据库上设置唯一索引,然后捕获从数据库中冒出来的错误。

答案 3 :(得分:0)

试试这个:

foreach($states_to_add as $item) {
    $dupesql = "SELECT 
                    name 
                FROM 
                    table 
                WHERE 
                    (name = '$name' 
                        AND description = '$description' 
                        AND manufacturer = '$manufacturer' 
                        AND city ='$city'
                        AND price = '$price' 
                        AND enddate = '$end_date'
                    )";

    $duperaw = mysql_query($dupesql);

    if( mysql_num_rows($duperaw) ) {
        echo nl2br("$name already exists in $city \n");
    } 
    else {
        $sql = "INSERT INTO table (..... (here go the values to be inserted)

答案 4 :(得分:0)

您不需要在PHP中检查唯一性,您可以在MySQL中进行整个测试:

INSERT INTO table1 (name, description, ......)
  SELECT name1, description1, manufacturer1, city1, price1, enddate1
  FROM (SELECT * FROM ( 
    SELECT 
      @name:= '$name' as name1
      ,@description:= '$description' as description1
      ,.....
    FROM DUAL as d1
    LEFT JOIN table1 t1 
           ON (t1.name = d1.name1 
          AND t1.description = d1.description1
          AND ......)
    WHERE t1.name IS NULL) s1) s2

只有在通过唯一性测试时才会插入值。

答案 5 :(得分:0)

简而言之,您需要通过PHP进行检查,还需要在MySQL表中添加复合唯一约束,以获得两全其美的效果。

如果我们将你的问题分成两个单独的问题,那将是件好事。

1-如何使用PHP检查重复项并在执行查询之前通知用户? 2-如何在MySQL中指定复合唯一约束?

首先,您需要一个简单的PHP函数来检查数据库中是否存在此记录,如下所示:

function is_exist($table, $data){
    $sql = "SELECT * FROM `" . $table . "` WHERE ";

    foreach ($data as $key => $val) :
    $sql .= "`$key`='" . $val . "' AND ";
    endforeach;

    $sql = substr($sql,0, -5);

    $result = $mysql_query($sql);
    $count = $mysql_num_rows($result);

    return ($count > 0) ? true: false;
}   

你应该像下面这样调用你的PHP函数:

    $data = array('column1'=>$_POST['value'],'column2'=>$_POST['value'], ...);

    if(is_exist($data)){
      // Print your error message
    }else{
     // Run your insert query
    }

这样你就可以在进入MySql数据库之前防止重复,但是为了拥有一个重复的免费数据库,你需要在MySQL表中添加一个复合唯一约束。

这个简单的SQL命令可以解决这个问题:

alter table `tablename` add unique index(name, description, manufacturer, city, price, enddate);

我希望有所帮助,如果我搞乱任何东西,请为我负担。

答案 6 :(得分:0)

尝试以下

  INSERT IGNORE INTO person_tbl (last_name, first_name) 
  -> VALUES( 'Jay', 'Thomas');