我使用以下脚本将记录上传到我的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);
}
?>
答案 0 :(得分:1)
只需在名称和邮政编码上创建一个UNIQUE键,当具有该字段的两个值的行已经存在时,就无法插入行。
答案 1 :(得分:1)
我能想到的两种纯MySQL方法可以解决这个问题。 REPLACE INTO
和INSERT IGNORE
。
REPLACE INTO
将覆盖现有行,而INSERT IGNORE
将忽略由在数据库中输入的重复键触发的错误。
如果使用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)唯一索引以准备下次导入。容易。