mysql - 如何处理 mysql #1062 - 创建大表时出现重复条目​​错误

标签 mysql sql

我正在处理一个包含大约 500 万条记录的表。我正在从 csv 文件加载记录。

有一个独特的列,url

插入时,如果 url 已在表中,我想更改新的 url 值,然后进行插入。

示例:

  • 尝试插入url“book”的记录。如果 "book" 已存在,则新记录的 url 应该为 "book-1"(然后为 "book-2 “ 等等)

  • 结果:除了初始值 url"book-1","book-2"... 也在表格中

我发现有两种方法可以做到这一点。

  1. 在插入每条记录之前:检查url值是否已经存在;如果是,则对新的 url 值进行所需的更改并插入。恐怕这会导致性能不佳。

  2. 插入记录而不检查 url 值是否已存在。如果 url 值已存在,则处理“mysql #1062 - 重复输入错误”并对 url 值进行所需的更改;重试插入。

这可能吗?如果是这样,怎么办?

最佳答案

如果这是一个一次性问题,我想推荐一种临时 MySQL 解决方案:

  1. 如果您的表不是 MyISAM,请转换为 MyISAM。
  2. 临时创建一个名为 auto_increment 的整数列 url_suffix .
  3. 暂时删除 url 上的唯一约束专栏。
  4. 创建多列索引( urlurl_suffix )并确保没有其他索引使用 url_suffix .
  5. 插入所有行,允许重复的网址。您会注意到 auto_increment url_suffix列现在以 url 为键。所以,第一个特定的url将有url_suffix1下一个2 ,等等。
  6. 执行如下更新,然后删除临时 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/

相关文章:

php - 在单列中管理父子层次结构

mysql - MySQL中如何将多张表聚合为一张?

mysql - 划分不同MySQL表中的两列

php - SQL 问题 - 如何从两个表中选择属于域列表的所有电子邮件?

c# - 无法从数据库获取不同的 NULL

C# 与 MySql 和 Unicode 字符

php - 链接数据库链接,通过 B、F、G 从 X 到 Y

mysql - 更新 id 和文本的分隔列表

sql - SQL 的 DELETE 语句真的删除数据吗?

sql - 为具有复杂关系的 3 个表创建 View