shopex v4.71数据转换出现错误:Duplicate entry '4-1' for key 1

2016-07-10 23:52 来源:www.chinab4c.com 作者:ecshop专家

shopex v4.71数据转换出现错误:Duplicate entry '4-1' for key 1
详情看附图


回答:
discuz 升级出现Duplicate entry 'xxx' for key 1 的解决办法
my73从leadbbs转换到discuz4.1是我做的,现在mwf想升级到5.0,他自己弄说又错误,我就花时间弄了下.
由于my73是从leadbbs导入到dz4.1,我按照升级步骤升级,发现 在升级程序运行至第3步出错,出错的表是cdb_members,用户表,错误类型就是标题上那个,我查阅一些资料,这个说得最详细:

分析:索引如果是primary unique这两两种,那么数据表的数据对应的这个字段就必须保证其每条记录的唯一性。否则就会产生这个错误。
一般发生在对数据库写操作的时候,例如Discuz!4.1论坛程序要求所有会员的用户名username必须唯一,即username 的索引是unique,这时如果强行往cdb_members表里插入一个已有的username的记录就会发上这个错误,或者将一条记录的 username更新为已有的一个username。
改变表结构的时候也有可能导致这个错误。例如 Discuz!4.0论坛的数据库中cdb_members.username 的索引类型是 index 这个时候是允许有相同username的记录存在的,在升级到4.1的时候,因为要将username的索引由原来的index变为unique。如果这 时cdb_members里存在有相同的username的记录,那么就会引发这个错误。
导出数据据时有时会因为一些原因(作者目前还不清楚)导致同一条记录被重复导出,那么这个备份数据在导入的时候出现这个错误是在所难免的了。
修改了auto_increment的值,致使“下一个 Autoindex”为一条已经存在的记录
解决:两种思路,一是破坏掉唯一性的索引。二是把重复的数据记录干掉,只保留一条。很显然第一种思路是不可取的。那么按照二的思路我们得出以下几种解决方法,对应上面的i ii iii

按照错误提示里的信息到数据库中将重复的记录删除,仅保留一条即可。之后继续执行升级操作。
这种情况发生的概率很小,可以用文本编辑器打开备份文档,查找重复的信息。将其多余的拿掉,仅保留一条即可。
查询出表中auto_increment最大的一条记录,设置auto_incerment比其大一即可。

我想了半天没有想到好的办法去查找相同的数据项,因为my73的用户超过1w了,数据很大,后来决定把这个表导出到本地,然后用编辑器打开sql文件,类似下面的格式:
insert INTO `cdb_members` VALUES ('1', 'Admin', '7f223d4dc8feaee07c215ed1ddea3049', '', 0, 1, 1, 0, '', '220.170.15.81', 1079193600, '218.75.226.252', 1158558733, 1158559024, 1158498152, 596, 0, 155, 4741, 2757, 3101, 10, 10, 0, 0, 0, 0, 0, 0, '52myxtu@163.com', '0000-00-00', 1, 0, 0, 0, '', 0, 3, 1, 1, 1, '9999', 0, 0),........,

想了下既然id是自动增加,我把插入语句中id全面改成空不就可以顺次插入了?于是我使用正则表达式
('[1-9]*',将这些全部替换成('',然后再将这个表清空,最后再导入这些语句,再次运行升级程序,一切Ok了.


参考地址:http://blog.donews.com/glemir/archive/2006/09/18/1040859.aspx