首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理mysql #1062 -创建大表时重复输入错误

如何处理mysql #1062 -创建大表时重复输入错误
EN

Stack Overflow用户
提问于 2012-02-20 13:15:34
回答 2查看 1.4K关注 0票数 2

我正在处理一张有大约500万张唱片的桌子。我正在从csv文件中加载记录。

有一个独特的列,url

在插入时,如果url已经在表中,我希望更改新的url值,然后执行插入。

示例:

  • 尝试使用url of "book"插入记录。如果book

已经存在,那么新记录应该有一个url of "book-1" (然后是"book-2"等等)

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

我发现有2种方式可以这么做。

插入每个记录之前的

  1. :检查url值是否已经存在;如果它存在,则对新的url值进行必要的更改并插入。我担心这将导致一个糟糕的performance.
  2. insert记录,而不检查url值是否已经存在。如果url值已经存在,则处理"mysql #1062 -重复输入错误“并对url值进行所需的更改;重新尝试插入.

这个是可能的吗?如果是这样的话,是怎么做的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-20 14:14:32

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

如果您的表不是MyISAM.

  • Temporarily,则转换为url_suffix.

  • Temporarily创建一个名为url_suffix.

  • Temporarily的auto_increment整数列,删除url列上的唯一约束。

  • 创建多列索引(urlurl_suffix),并确保没有使用url_suffix.

  • Insert所有行的其他索引,从而允许重复URL。您会注意到,auto_increment url_suffix列现在是在url上键键的。因此,第一个特定的url将具有url_suffix of 1和next 2,等等。

  • 执行如下更新,然后删除临时url_suffix列并将唯一约束放回。

查询以更新所有行:

代码语言:javascript
复制
UPDATE urls
SET url = if (url_suffix = 1, url, CONCAT(url, '-', url_suffix - 1))

实际上,您可以跳过步骤6,保留auto_increment字段,这样以后您就可以轻松地添加重复的URL,只需像这样获取您的URL:

代码语言:javascript
复制
SELECT (if (url_suffix = 1, url, CONCAT(url, '-', url_suffix - 1))) AS url
FROM urls

您的数据应该如下所示:

代码语言:javascript
复制
url     url_suffix
---------------------------
that    1
that    2
this    1
this    2
this    3
those   1
票数 1
EN

Stack Overflow用户

发布于 2012-02-20 13:35:18

这里有一个问题,一个简单的触发器在插入时会被证明是无效的,因为你说它们会从'book‘到'book-1’book-2‘等等。最简单的方法是有一个新列,其中包含一个默认值为0的数值。这可以在存储过程中完成,即

代码语言:javascript
复制
CREATE PROCEDURE `insertURL`(inURL VARCHAR(255))

BEGIN
    DECLARE thisSuffix INT UNSIGNED DEFAULT 0;
    // We have to get this ID first, as MySQL won't let you select from the table you are inserting to
    SELECT COALESCE(MAX(url_suffix)+1,0) INTO thisSuffix FROM urls WHERE url_column = inURL;
    // Now the ID is retrieved, insert
    INSERT INTO urls (
        url_column,
        url_suffix
    ) VALUES (
        inURL,
        thisSuffix
    );
    // And then select the generated URL
    SELECT IF(thisSuffix>0,CONCAT(inURL,'-',thisSuffix),inURL) AS outURL;
END

然后使用以下方法调用

代码语言:javascript
复制
CALL insertURL('book');

如果后缀为0,则返回“book”;如果后缀大于0,则返回“book-1”。

为了测试我的表设计

代码语言:javascript
复制
CREATE TABLE `urls` (
`url_column`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`url_suffix`  tinyint(3) UNSIGNED NOT NULL ,
PRIMARY KEY (`url_column`, `url_suffix`)
);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9361761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档