【问题标题】:phpMyAdmin export/import results in duplicate primary key errorphpMyAdmin 导出/导入导致重复主键错误
【发布时间】:2011-08-17 03:13:05
【问题描述】:

我想用一个新的站点 URL 全局替换 Wordpress MySQL 数据库中我的站点 URL 的所有实例。为此,我使用 phpMyAdmin 将数据库导出到 .sql 文件,然后在文本编辑器中进行全局替换,然后使用 phpMyAdmin 导入 .sql 文件。

在导入过程中,我遇到了主键错误的重复条目。尝试调试这个,我导出了文件,然后导入了相同的文件,没有做任何更改,我仍然得到同样的错误。

感谢任何帮助解决此问题。

--
-- Dumping data for table `wp_comments`
--
INSERT INTO  `wp_comments` 
  (`comment_ID`, `comment_post_ID`, `comment_author`, `comment_author_email`
  ,`comment_author_url`, `comment_author_IP`, `comment_date`, `comment_date_gmt` 
  ,`comment_content`, `comment_karma`, `comment_approved`, `comment_agent` 
  ,`comment_type`, `comment_parent`, `user_id`) 
VALUES (1, 1, 'Mr WordPress', ''
       ,'http://wordpress.org/', '', '2011-04-28 00:49:55', '2011-04-28 00:49:55'
       ,'Hi, this is a comment.<br />To delete a comment, 
         just log in and view the post&#039;s comments. 
         There you will have the option to edit or delete them.'
       , 0, 'post-trashed',  '',  '', 0, 0 ) ;

MySQL said: 

#1062 - Duplicate entry '1' for key 'PRIMARY' 

【问题讨论】:

  • @Johan - 感谢您进行编辑以使我的问题中的代码更清晰。

标签: mysql wordpress insert phpmyadmin


【解决方案1】:

原始数据仍在数据库中。

如果您手动工作,您将发送带有新值的 UPDATE 而不是 INSERT 查询,但由于您正在执行批量导入,因此在导入。

DELETE FROM `tblName`;

请务必先备份您的数据。

【讨论】:

  • 谢谢。事实上,就我而言,我认为我可以在导入之前删除整个数据库。
【解决方案2】:

为避免重复,您必须使用 UPDATE 而不是 INSERT 语句。要在 phpMyAdmin 中实现这一点,请按照下列步骤操作:

  1. 在树中选择您的数据库。
  2. 可选。转到“搜索”选项卡并在所有表中搜索要替换的字符串。如果仅在多个表中找到字符串,请记下它们的名称。这将有助于通过仅更新需要更新的表来加快进程。如果您有大量数据,这一点很重要。
  3. 转到“导出”选项卡。
  4. 在“导出方法:”中选择“自定义”。
  5. 可选。如果您在上面的第 2 步中注意到需要更新的表,则在“表:”部分中,单击“取消全选”,然后仅选择需要更新的表。
  6. 向下滚动到“数据创建选项”部分,然后在下拉菜单中 标有“转储数据时使用的功能:”框选择“更新” (默认为“插入”)。
  7. 单击“开始”。
  8. 打开下载的 SQL 转储文件。
  9. 重要!在进行任何更改之前,使用新名称保存文件以进行备份。
  10. 使用编辑器的搜索和替换功能来更改您想要的内容。然后保存文件。
  11. 在 phpMyAdmin 中转到“导入”选项卡。
  12. 在“要导入的文件:”部分单击“选择文件”按钮并 浏览已编辑的文件。点击开始

你准备好了!要检查一切是否正常,请第二次搜索数据库(重复步骤 2)。您应该找不到任何包含旧字符串的表。

【讨论】:

  • 对于一些大型 Wordpress 文件,我遇到了主键重复错误,您的回答成功了!
  • 谢谢乔治。使用这种方法,我仍然收到有关主键重复的警告,但所有字符串都按预期替换。所以,在这种情况下,我想我们可以忽略有关主键重复的消息,对吧?
【解决方案3】:

如果您正在导出,这意味着主要内容保留在数据库中。因此,当您尝试使用相同的 PRIMARY KEY(始终是唯一的)插入新行时,您会收到错误消息。

解决方案:您必须从表中删除具有相同comment_ID 的行。 您必须打开 PHPMyAdmin 并转到您的表格页面,并检查具有所需 ID 的行。在本例中为 1,这意味着它可能位于表格列表的第一个结果页面中。只需点击行中出现的红色 X。

这也可以通过 SQL 来完成,也可以很简单。

DELETE FROM `wp_comments` WHERE `comment_ID` = 1 LIMIT 1

为此,只需在 PHPMyAdmin 中选择您的数据库并转到 SQL 选项卡,然后在文本区域中插入上面的代码。

【讨论】:

  • 您不必必须删除该行,只需删除insert ... on duplicate key update(请参阅下面的答案)。
  • @Scorch,好的,我必须在 phpmyAdmin 中执行哪些步骤,我不知道阅读您的答案。
  • @Johan 我没有提供 ON DUPLICATE KEY UPDATE 解决方案,因为那只会更新不必要的(旧)行,而不是删除它。这意味着它将创建给 cmets,因为旧的会保留。关于这篇文章,我已经编辑过了。我是新来的,我不认为有必要一步一步地描述。我很抱歉。 :)
  • 对您重新导入的每一行依次执行此操作很有趣。
  • @Scorch,更新会覆盖数据,它不会在某处添加额外的副本,所以我对the old would remain 的位置感到困惑。在旁注中,这里不需要limit 1,因为comment_id 是主键,因此始终是唯一的,包括limit 1 作为防止失控删除的习惯并不是一个坏主意。
【解决方案4】:

有同样的问题和错误号。删除数据库,重新创建没有表,并导入更改后的导出文件对我有用。

【讨论】:

    【解决方案5】:

    问题与您的文件有关 - 您正在尝试使用副本创建数据库 - 在文件顶部您会发现如下内容:

    如果不存在则创建数据库*THE_NAME_OF_YOUR_DB* 默认字符集 latin1 整理 latin1_general_ci; 使用*THE_NAME_OF_YOUR_DB*;

    我确定您已经有一个具有此名称的数据库 - 在同一服务器中 - 请检查,因为您正在尝试覆盖!只需更改名称或(更好)删除这条线!

    【讨论】:

      【解决方案6】:

      由于您已经有该记录,您可以只更新记录而不是插入。它会是这样的。

        UPDATE `wp_comments` 
        SET 'comment_author_url' = 'YOUR NEW ADDRESS'
        WHERE  `comment_ID` = 1
      

      只需使用此方法更新旧地址的每个实例。您可以通过说“WHERE 'comment_author_url' = 'YOUR OLD ADDRESS'”来搜索所有帖子

      【讨论】:

        【解决方案7】:

        如果您只想替换您的网址,我相信您必须这样做:

        Update `wp_comments` Set 
        `comment_author_url` = 'http://wordpress.org/'
        Where `comment_author` = 'Mr WordPress'
        

        只需在 PHPMyAdmin 的 SQL 框中输入上述 SQL 并执行即可。

        注意:首先确保您有备份。而且没有必要做所有导出和导入的事情:)

        【讨论】:

        • URL 散布在整个数据库中的许多不同表中。这是一个WordPress的东西。当我在文本编辑器中进行全局文本替换时,它替换了 215 次。
        【解决方案8】:

        代码改为

        INSERT .... (what you already have) 
        ON DUPLICATE KEY UPDATE;
        

        这将用最少的麻烦解决您的问题,同时仍然插入新行。

        【讨论】:

        • 我的答案针对批量导出/导入工具的使用进行了优化,例如 phpmyadmin 中的工具。即使从语义上严格来说,OP 想要 一个新的开始,而不是潜在的旧数据。坦率地说,我什至建议删除并重新创建表格。
        • @Tomalak,根据外键约束,这可能是不可能的。
        • Wordpress tables are MyISAM(除非明确转换)。 MyISAM 不支持外键。
        • @Tomalak,考虑到 wp 需要的全文搜索,OK 是有道理的。
        猜你喜欢
        • 2017-10-19
        • 2014-10-10
        • 2010-11-14
        • 2016-12-06
        • 1970-01-01
        • 2012-02-02
        • 2014-07-07
        • 2012-11-30
        相关资源
        最近更新 更多