我正在处理一个包含大约 500 万条记录的表。我正在从 csv 文件加载记录。
有一个独特的列,url
。
插入时,如果 url
已在表中,我想更改新的 url
值,然后进行插入。
示例:
尝试插入
url
为“book”
的记录。如果"book"
已存在,则新记录的url
应该为"book-1"
(然后为"book-2 “
等等)结果:除了初始值
url
值"book-1","book-2"...
也在表格中书
我发现有两种方法可以做到这一点。
在插入每条记录之前:检查
url
值是否已经存在;如果是,则对新的url
值进行所需的更改并插入。恐怕这会导致性能不佳。插入记录而不检查
url
值是否已存在。如果 url 值已存在,则处理“mysql #1062 - 重复输入错误”并对 url 值进行所需的更改;重试插入。
这可能吗?如果是这样,怎么办?
最佳答案
如果这是一个一次性问题,我想推荐一种临时 MySQL 解决方案:
- 如果您的表不是 MyISAM,请转换为 MyISAM。
- 临时创建一个名为 auto_increment 的整数列
url_suffix
. - 暂时删除
url
上的唯一约束专栏。 - 创建多列索引(
url
、url_suffix
)并确保没有其他索引使用url_suffix
. - 插入所有行,允许重复的网址。您会注意到 auto_increment
url_suffix
列现在以 url 为键。所以,第一个特定的url
将有url_suffix
的1
下一个2
,等等。 - 执行如下更新,然后删除临时 url_suffix 列并放回唯一约束。
更新所有行的查询:
UPDATE urls
SET url = if (url_suffix = 1, url, CONCAT(url, '-', url_suffix - 1))
事实上,您可以跳过第 6 步,保留 auto_increment 字段,以便将来可以轻松添加重复的 URL,并像这样简单地获取 URL:
SELECT (if (url_suffix = 1, url, CONCAT(url, '-', url_suffix - 1))) AS url
FROM urls
您的数据将如下所示:
url url_suffix
---------------------------
that 1
that 2
this 1
this 2
this 3
those 1
关于mysql - 如何处理 mysql #1062 - 创建大表时出现重复条目错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9361761/