解决 mysql 导入时重复的主键

Posted

技术标签:

【中文标题】解决 mysql 导入时重复的主键【英文标题】:Resolving a duplicate primary key on mysql import 【发布时间】:2012-03-25 12:39:47 【问题描述】:

我希望将 cmets 表从一个 WordPress 站点附加到另一个站点。用户不同。当我将 cmets 从站点 B 导入到 A 时,我遇到了重复密钥问题; comment_id 已被占用。

那么我该如何解决这个问题并在表格中附加一个简单的 .sql 文件呢?我是否必须获取用户信息,生成新用户,检查在站点 B 上创建的 cmets,提取内容和 postID,然后返回站点 A 并为新创建的用户重新创建评论!?

真是头疼!谢谢。

【问题讨论】:

【参考方案1】:

如果您唯一的问题是重复键问题,请在之后转到 sql 文件的末尾 ENGINE=MyISAM 并做到 ENGINE=MyISAM AutoIncrement=a nubmer above the last id in the new database

在数据库 A 中查询最后一个 id,然后添加一个并在新的插入查询中使用它。

示例 1:

CREATE TABLE IF NOT EXISTS `movies` (
  `id` int(255) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `year` int(4) NOT NULL,
  `size` varchar(255) NOT NULL,
  `added` date NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `title` (`title`,`year`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

我的转储中的插入:

INSERT INTO `movies` (`title`, `year`, `size`, `added`) VALUES
('[REC] 2', 0, '716688', '2011-09-23'),
('5 Days of War', 0, '1435406', '2012-01-09'),
('[REC]', 0, '1353420800', '2011-11-06');

看看我如何没有在我的包含中包含PRIMARY KEY (id),但它仍会检查我的UNIQUE KEY 并查看标题是否存在。只是一个小演示,希望能有所帮助。如果您的表已经存在于新数据库中,那么只需跳到插入并且不包含主键,它将在新插入时自动设置为下一个可用值。

【讨论】:

所以按照你的第一种方法,说旧数据库以主键 5 结尾,你说 ENGINE=MyISAM AutoIncrement=6,新数据库中的其余条目将被导入为 6, 7 , 8 等等? 正确,当您设置自动增量时,它从指定的数字开始,如果您没有包含它,它会自动从 1 开始并向前移动,如果您尝试更新,这就是导致错误的原因从垃圾场。只是不要在转储的插入中包含 primary_key,它应该像一个魅力一样工作。我将从我的一个数据库中编辑并发布一个演示。

以上是关于解决 mysql 导入时重复的主键的主要内容,如果未能解决你的问题,请参考以下文章

关于sqlite数据库导入了一半时,遇到重复id停止了。所以操作回滚,但剩下db-journal文件。怎么解决冲突哇

mysql过滤重复数据的问题

sqoop从hive导入数据到mysql时出现主键冲突

Oracle9i用客户端PLSQL导入dmp文件的时候,有一些表的主键导入失败。帮帮忙。

不同步时如何重置postgres的主键序列?

不同步时如何重置postgres的主键序列?