防止MYSQL数据库与上传的CSV重复

时间:2012-01-15 00:49:04

标签: php mysql csv upload

我使用以下脚本将记录上传到我的MYSQL数据库,我可以看到的问题是是否上传了客户端记录,并且它已经存在于数据库中并且是重复的。

我在这里看到很多关于人们询问如何在上传时从csv文件中删除重复项的帖子,例如,如果有两个名称为bob的实例,并且csv中的邮政编码lh456gl不上传它,但是我想知道是否可以在添加该记录之前先检查数据库中的记录,以免插入已存在的记录。

类似于:

if exist namecolumn=$name_being_inserted and postcode=postcode_being_inserted then
  do not add that record.

这甚至可以吗?。

<?php
//database connect info here

//check for file upload
if(isset($_FILES['csv_file']) && is_uploaded_file($_FILES['csv_file']['tmp_name'])){

    //upload directory
    $upload_dir = "./csv";

    //create file name
    $file_path = $upload_dir . $_FILES['csv_file']['name'];

    //move uploaded file to upload dir
    if (!move_uploaded_file($_FILES['csv_file']['tmp_name'], $file_path)) {

        //error moving upload file
        echo "Error moving file upload";

    }

    //open the csv file for reading
    $handle = fopen($file_path, 'r');

    while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) {

        //Access field data in $data array ex.
        $name = $data[0];
        $postcode = $data[1];

        //Use data to insert into db
        $sql = sprintf("INSERT INTO test (name, postcode) VALUES ('%s','%s')",
                    mysql_real_escape_string($name),
                    mysql_real_escape_string($postcode)
                    );
        mysql_query($sql) or (mysql_query("ROLLBACK") and die(mysql_error() . " - $sql"));
    }

    //delete csv file
    unlink($file_path);
}
?>

3 个答案:

答案 0 :(得分:1)

只需在名称和邮政编码上创建一个UNIQUE键,当具有该字段的两个值的行已经存在时,就无法插入行。

答案 1 :(得分:1)

我能想到的两种纯MySQL方法可以解决这个问题。 REPLACE INTOINSERT IGNORE

REPLACE INTO将覆盖现有行,而INSERT IGNORE将忽略由在数据库中输入的重复键触发的错误。

这是described in the manual

  

如果使用IGNORE关键字,则执行时会出现错误   INSERT语句被视为警告。例如,没有   IGNORE,一个复制现有UNIQUE索引或PRIMARY KEY的行   表中的值导致重复键错误,语句为   中止。使用IGNORE时,仍未插入行,但没有错误   发出的。

要使INSERT IGNORE生效,您需要在一个或多个字段上设置UNIQUE键/索引。查看您的代码示例,虽然您没有任何可以在插入查询中被认为是唯一的。如果在伍尔弗汉普顿有两个约翰史密斯怎么办?理想情况下,您可能会将电子邮件地址定义为唯一。

答案 2 :(得分:0)

我会让记录插入数据库中,然后在插入这些记录后,执行:

ALTER IGNORE TABLE dup_table ADD UNIQUE INDEX(a,b);

其中a和b是你不希望有重复的列(关键列......你可以有更多)。您可以将所有内容包装到事务中。因此,只需启动事务,插入所有记录(无论它们是否重复),执行我编写的命令,提交事务,然后您可以删除该(a,b)唯一索引以准备下次导入。容易。