导入数据如何避免重复?

wengqihan3 2012-07-19 02:59:17
有一组数据(大概几万条吧)需要插入数据库,比如从EXCEL导入一组数据到MYSQL数据库,如何避免重复插入,这里所指的重复并不是指某一个字段的重复,而是多个字段组合的重复,比如:
id name content
1 张三 吃饭
2 李四 吃饭
3 张三 喝水

如上,如果name 和 content字段的值都重复才算重复,比如再插入一条"张三,吃饭"就提示重复并统计出重复的数量和已插入数据的数量,如果是在PHP里插入一条之前先判断是否存在那几万条数据都挨个判断一次会严重影响性能,大家有什么好的方法?求PHP语句
...全文
573 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
鯨魚先生 2014-12-26
  • 打赏
  • 举报
回复
请问楼主问题怎么解决的
傲雪星枫 2014-12-26
  • 打赏
  • 举报
回复
如何判断哪些是重复被唯一索引过滤掉的呢 插入成功後調用mysql_insert_id()是可以返回最後一條插入紀錄的id 如果返回0,就表示插入失敗。可以用此來判斷。
傲雪星枫 2014-12-26
  • 打赏
  • 举报
回复
多個字段設聯合唯一索引試試
wuqedfs 2012-07-29
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

引用 16 楼 的回复:

引用 14 楼 的回复:

PHP code

// 数据库中查出来的所有数据
$dbData = array(
array(0, '张三', '吃饭'),
array(1, '李四', '吃饭'),
);

// excel中的数据
$excelData = array(
array('张三', '吃饭'), // 与 $excelD……
[/Quote]
你这个把不重复的找出来了,那能不能把不重复的记录也找出来呢?
wengqihan3 2012-07-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

在 name content 上建联合唯一索引
[/Quote]
这样倒是可以过滤重复了,但问题又来了,如何判断哪些是重复被唯一索引过滤掉的呢
kyzy_yy_pm 2012-07-26
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

引用 14 楼 的回复:

PHP code

// 数据库中查出来的所有数据
$dbData = array(
array(0, '张三', '吃饭'),
array(1, '李四', '吃饭'),
);

// excel中的数据
$excelData = array(
array('张三', '吃饭'), // 与 $excelData中数据重复
array('……
[/Quote]

就是pring_r()打印看看
wengqihan3 2012-07-26
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

PHP code

// 数据库中查出来的所有数据
$dbData = array(
array(0, '张三', '吃饭'),
array(1, '李四', '吃饭'),
);

// excel中的数据
$excelData = array(
array('张三', '吃饭'), // 与 $excelData中数据重复
array('李四', '吃饭'),……
[/Quote]

语文这里的p($excelData);
p();方法是什么方法?
kyzy_yy_pm 2012-07-23
  • 打赏
  • 举报
回复

// 数据库中查出来的所有数据
$dbData = array(
array(0, '张三', '吃饭'),
array(1, '李四', '吃饭'),
);

// excel中的数据
$excelData = array(
array('张三', '吃饭'), // 与 $excelData中数据重复
array('李四', '吃饭'), // 与 $excelData中数据重复

array('张三', '喝水') // *应该促入数据库的数据<<<
);


$mark = array(); // 用来当作唯一标识的容器
foreach ($dbData as $arr) {
$md5Mark = md5($arr[1] . $arr[2]);
$mark[$md5Mark] = 1;
}

foreach ($excelData as $key => $arr) {
$md5Mark = md5($arr[0] . $arr[1]);
if (isset($mark[$md5Mark])) {
unset($excelData[$key]);
}
}

p($excelData);


/*
Array
(
[2] => Array
(
[0] => 张三
[1] => 喝水
)

)
*/
kyzy_yy_pm 2012-07-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 3 楼 的回复:
PHP code
$excelData = array(
array('张三', '吃饭'),
array('李四', '吃饭'),
array('张三', '喝水'),
array('李四', '吃饭'),// 重复
array('张三', '喝水') // 重复
);

$mark = array(); // 用来当作唯一标识
for……

……
[/Quote]

将数据库里所有是数据查出来,循环将name和content连接起来,也把excel数据中的name和content连接起来,然后计算两个数组的差值,将差值存入数据库
baoxiaohua 2012-07-23
  • 打赏
  • 举报
回复
联合索引:create UNIQUE INDEX 索引名 on 表名 (name,content);
wengqihan3 2012-07-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
在 name content 上建联合唯一索引
[/Quote]
在 name content 上建联合唯一索引,如何建?因为Name和content都有重复的,不能单个唯一索引,关于两个联合起来建唯一索引如何建?
jason09527 2012-07-22
  • 打赏
  • 举报
回复
5楼正解
qq120848369 2012-07-22
  • 打赏
  • 举报
回复
建唯一索引或者主键, 自己根据实际情况应用.
wengqihan3 2012-07-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
在 name content 上建联合唯一索引
[/Quote]
name和content都不能唯一,因为都有重复的记录,至于联合唯一索引,没听说过,如何建啊?
wengqihan3 2012-07-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
在 name content 上建联合唯一索引
[/Quote]
name和content都不能唯一,因为都有重复的记录,至于联合唯一索引,没听说过,如何建啊?
wengqihan3 2012-07-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
PHP code
$excelData = array(
array('张三', '吃饭'),
array('李四', '吃饭'),
array('张三', '喝水'),
array('李四', '吃饭'),// 重复
array('张三', '喝水') // 重复
);

$mark = array(); // 用来当作唯一标识
for……
[/Quote]
问题是要导入数据和数据库里已存在的数据重复,如何处理避免和数据库已存在的数据重复?并不是要导入的数据里有重复记录
o_owangdong 2012-07-19
  • 打赏
  • 举报
回复
恩 ,楼上好办法
xuzuning 2012-07-19
  • 打赏
  • 举报
回复
在 name content 上建联合唯一索引
kyzy_yy_pm 2012-07-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

引用 1 楼 的回复:
将name连接content的组合字符串md5加密后放到数组中,如果已经存在了,那么就将该项数据从数据中删除

MD5加密后判断就不会影响性能吗,几万条数据挨个去是很耗时的
[/Quote]
这随便,你可以不加密,直接连接起来就行
kyzy_yy_pm 2012-07-19
  • 打赏
  • 举报
回复
$excelData = array(
array('张三', '吃饭'),
array('李四', '吃饭'),
array('张三', '喝水'),
array('李四', '吃饭'),// 重复
array('张三', '喝水') // 重复
);

$mark = array(); // 用来当作唯一标识
foreach ($excelData as $key => $arr) {
$md5Mark = md5($arr[0] . $arr[1]);
if (isset($mark[$md5Mark])) {
unset($excelData[$key]);
} else {
$mark[$md5Mark] = 1;
}
}

// 此时你就可以操作$excelData而不用判断了,当然了你也可以直接在else中进行sql语句的组合或者数据库写入操作
p($excelData);
/*
输出:
Array
(
[0] => Array
(
[0] => 张三
[1] => 吃饭
)

[1] => Array
(
[0] => 李四
[1] => 吃饭
)

[2] => Array
(
[0] => 张三
[1] => 喝水
)

)
*/
加载更多回复(2)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧