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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于sqlite数据库导入了一半时,遇到重复id停止了。所以操作回滚,但剩下db-journal文件。怎么解决冲突哇相关的知识,希望对你有一定的参考价值。

就是怎么忽略错误导入,或者利用db-journal文件不让他回滚。

要忽略冲突,你把id的主键给删掉。主键有单一性约束。
db-journal是日志文件,跟回滚不回滚没关系。
你不希望数据回滚?其实数据库在遇到冲突事件自动回滚的功能,是为了保护数据。这样的话,你可以回到你要导入的文件里面去,修改完善之后再导入。
其次,设主键最好是设与你的信息基本上没有关系的列作为键。对于主键的设置你可以参考网上的其他资料。
希望我的回答对你有所帮助。追问

1.首先谢谢您的回答。
2.主键约束我当然懂,现在我做的是要整合数据。原来数据库是分布式的,所以,各个数据库自动生成的uiid作为主键,在上亿数据当中就出现了偶然的重复。所以要求现在导入时忽略冲突。
3.上亿条数据的大量导入,在即将完成时回报error。因为它的回滚八个小时的等待成为了泡影,所以我希望它不回滚。想问下有没有sqlite import on conflict方面的帮助。再次感谢哈。。

参考技术A

db-journal是用来事务回滚的。可以这样

attach database test.db as test;
replace into target_table select * from test.target_table;

这样可能丢掉一些数据。

解决 mysql 导入时重复的主键

【中文标题】解决 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,它应该像一个魅力一样工作。我将从我的一个数据库中编辑并发布一个演示。

以上是关于关于sqlite数据库导入了一半时,遇到重复id停止了。所以操作回滚,但剩下db-journal文件。怎么解决冲突哇的主要内容,如果未能解决你的问题,请参考以下文章

解决 mysql 导入时重复的主键

将数据插入SQLite表后如何获取最后一行ID [重复]

关于女神SQLite的疑惑

关于女神SQLite的疑惑

显示来自sqlite数据库的数据时“尝试在空对象引用上调用虚拟方法”[重复]

Sqlite 限制具有相同 id 的重复行