phpMyAdmin的导入/导出结果出现了重复主键错误

4
我希望能够全局替换Wordpress MySQL数据库中站点URL的所有实例为新的站点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' 

1
@Johan - 感谢您编辑我的问题中的代码,使其更易读。 - LandedGently
8个回答

6

原始数据仍然存储在数据库中。

如果您手动操作,可以使用UPDATE查询发送新值,而不是INSERT查询。但由于您正在进行批量导入,最好在导入之前清空现有表格。

DELETE FROM `tblName`;

务必先备份您的数据。


谢谢。实际上,在我的情况下,我认为在进行导入之前可以删除整个数据库。 - LandedGently

4
为避免重复,您需要使用UPDATE而不是INSERT语句。在phpMyAdmin中实现这一点,请按照以下步骤操作:
  1. 在树中选择您的数据库。
  2. 可选。转到“搜索”选项卡,并搜索要在所有表中替换的字符串。如果该字符串仅在几个表中找到,请记下它们的名称。这将有助于通过仅更新需要更新的表来加快流程。如果您有大量数据,则此过程可能很重要。
  3. 转到“导出”选项卡。
  4. 在“导出方法:”中选择“自定义”。
  5. 可选。如果您在上述第2步中注意到需要更新的表格,则在“表格:”部分中,单击“取消选择全部”,然后只选择需要更新的表格。
  6. 向下滚动到“数据创建选项”部分,并在下拉框“转储数据时使用的函数:”中选择“UPDATE”(默认为“INSERT”)。
  7. 单击“Go”。
  8. 打开下载的SQL转储文件。
  9. 重要!在进行任何更改之前,出于备份目的,将文件另存为新名称。
  10. 使用编辑器的搜索和替换功能更改所需内容。然后保存文件。
  11. 在phpMyAdmin中转到“导入”选项卡。
  12. 在“要导入的文件:”部分,单击“选择文件”按钮并浏览已编辑的文件。单击GO。
您已准备就绪!为了检查是否一切正常,请第二次搜索数据库(重复第2步)。您不应该找到任何包含旧字符串的表格。

在处理一些较大的WordPress文件时,我遇到了主键重复错误,您的答案解决了这个问题! - Sam Bellerose
谢谢George。使用这种方法,我仍然收到了关于主键重复的警告,但所有字符串都被替换为预期的内容。所以,在这种情况下,我们可以忽略有关主键重复的消息,对吗? - mbrinson

2
如果你正在导出,那么主要内容将保留在数据库中。因此,当你尝试插入一个具有相同 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(见下面的答案)即可。 - Johan
@Scorch,好的,我需要在phpmyAdmin中执行哪些步骤呢?从你的回答中我没看出来。 - Johan
@Scorch:我认为你误解了ON DUPLICATE KEY UPDATE的作用。它会更新,而不是忽略。你不会得到两个相同的评论。 - Lightness Races in Orbit
1
@Scorch,更新会覆盖数据,而不是在其他地方添加额外的副本,所以我很困惑旧内容将在哪里保留。顺便说一句,这里不需要limit 1,因为comment_id是主键,因此始终唯一,但养成加上limit 1以防止误删的习惯也不是坏主意。 - Johan
@Johan 好的,我原本以为它只会将旧ID更新以避免与新ID冲突,但我在网上搜索后发现这种信息是错误的(你是对的:D)。对于造成的混淆,我真的很抱歉。:( - Pedro M. Silva
显示剩余4条评论

1
问题与您的文件有关 - 您正在尝试使用副本创建一个数据库 - 在您的文件顶部,您将找到类似于以下内容的内容: CREATE DATABASE IF NOT EXISTS*数据库名称*DEFAULT CHARACTER SET latin1 COLLATE latin1_general_ci; USE*数据库名称*; 我确信您已经有了一个具有此名称的数据库 - 在同一服务器上 - 请检查,因为您正在尝试覆盖它!只需更改名称或(更好的选择)删除此行!

1

我曾经遇到过同样的问题和错误代码。删除数据库,重新创建没有表格的数据库,并导入更改后的导出文件对我有用。


0

由于您已经有了那条记录,所以可以直接更新记录而不是插入。 大致会是这样。

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

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


0
如果你只想替换你的URL,我相信你只需要做以下这些:
Update `wp_comments` Set 
`comment_author_url` = 'http://wordpress.org/'
Where `comment_author` = 'Mr WordPress'

只需将上述SQL键入到PHPMyAdmin的SQL框中并执行即可。

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


URL在数据库中的许多不同表中都有出现。这是WordPress的一个特点。当我在文本编辑器中进行全局文本替换时,它替换了215个出现。 - LandedGently

0

将代码更改为

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

这将在最小的麻烦下解决您的问题,同时插入新行。


我的答案是针对批量导出/导入工具进行了优化,例如phpmyadmin中的工具。即使从严格的语义上讲,OP也“想要”一个全新的开始,而不是潜在的旧数据留在那里。坦白地说,我甚至建议删除并重新创建表。 - Lightness Races in Orbit
@Tomalak,这可能取决于外键约束,也可能不可能。 - Johan
WordPress的表格是MyISAM(除非明确转换)。MyISAM不支持外键。 - Lightness Races in Orbit
@Tomalak,考虑到wp需要进行全文搜索,这是有道理的。 - Johan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接