我对SQLite数据库有一个奇怪的错误:You can download it here
每次我尝试在表格中插入一些东西" CurrencyTransactions"它失败了,因为一个名为7
的新列无缘无故地出现了。
我试图放弃桌子但是
我跑了PRAGMA integrity_check
,但我发现了这个错误
然后我尝试导出.sql
文件并在新的数据库中再次导入,但
1)如果我只导入结构,它运行正常,我不再拥有7
列
2)如果我导入条目,则失败并显示以下错误: 这意味着:"流程#74中的错误:不是错误"
要完成,我还尝试了this solution,但创建的新数据库是空的。
我该怎么办?我真的需要保存这些条目。
答案 0 :(得分:1)
我建议使用数据库浏览器。
打开一个新数据库,例如nadekobotfix.db。 (可以是同名但位置不同)
根据以下方面的努力工作: -
您可能需要删除/忽略第一行和最后一行(BEGIN TRANSACTION;
和后续COMMIT;
)
由于约束,您可能无法直接运行生成的SQL(尝试使用约束失败)。
您需要从文件中复制部分,并根据约束(外键)强加的层次结构运行。如果您有CHECK约束,则可能需要考虑这些因素。 (没有触发器担心)。
SELECT * FROM sqlite_master WHERE type = 'table' AND instr(sql,'CHECK');
不返回任何内容,因此没有 CHECK 约束。索引可以/应该保留到最后(因为它们在生成的SQL中)。
一个部分将包含一个表的create语句以及insert语句。
您可能希望创建表格(部分)的电子表格,以便在完成后将其标记为关闭。
以下查询可以提供帮助,因为NA可以先完成
SELECT CASE WHEN instr(sql,'FOREIGN KEY') THEN 'FK' ELSE 'NA' END AS fkey, name,sql
FROM sqlite_master
WHERE type = 'table' AND name NOT LIKE 'sqlite%' ORDER BY instr(sql,'FOREIGN KEY')
您可以从数据库浏览器中导出单个表格,以便SQlite在完成后将其标记为关闭。
您可能希望定期执行 integrity_check
。
如果这样做(您可能需要对SQL进行调整),那么您可以重命名旧数据库,然后重命名新数据库(或者移动旧数据库,如果使用相同的数据库名称则复制新数据库)。
您可能希望留意: -
除少数例外情况外,通常不会对损坏的数据库进行分析 帮助确定出了什么问题。一种更好的避免方法 "危险",我们发现,是阅读和理解 https://www.sqlite.org/howtocorrupt.html
* in database main * 页面10628:btreeInitPage()返回错误代码11
这表明页面标题严重损坏了SQLite 完全不能解释这个页面。一个可能的原因:第10628页 已被归零。你能看一下该页面的十六进制转储吗? (记得 那个SQLite编号以1开头的页面,所以页面的开头 是pgsz * 10627,其中pgsz是页面大小。) - D. Richard Hipp
“btreeInitPage() returns error code 11”
Reminders 表有一个名为When的列,这是一个SQL关键字(不可取的列名IMO),因此INSERT生成的SQL不会包装列名,所以你会得到错误。
即。 : -
CREATE TABLE IF NOT EXISTS `Reminders` (
`Id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
`ChannelId` INTEGER NOT NULL,
`IsPrivate` INTEGER NOT NULL,
`Message` TEXT,
`ServerId` INTEGER NOT NULL,
`UserId` INTEGER NOT NULL,
`When` TEXT NOT NULL,
`DateAdded` TEXT
);
INSERT INTO `Reminders` (Id,ChannelId,IsPrivate,Message,ServerId,UserId,When,DateAdded) VALUES (1270,367886754973351936,1,'Birthday Day',318127386367623170,367886754973351936,'2018-05-03 22:07:48.1860996','2018-03-18 22:07:48.186101'),
(1271,248278722656993281,1,'to remind Chanmi to remind Jayos to DeagleMomoka',318127386367623170,248278722656993281,'2018-05-05 22:08:58.4915565','2018-03-18 22:08:58.4915582'),
(1376,170240129414201344,1,'timely',318127386367623170,170240129414201344,'2018-03-29 09:00:29.4476776','2018-03-28 09:00:29.447679'),
(1377,373301201158144000,1,'timely',318127386367623170,373301201158144000,'2018-03-29 09:50:14.1631563','2018-03-28 09:50:14.1631577'),
(1378,248278722656993281,1,'timely',318127386367623170,248278722656993281,'2018-03-29 11:24:27.0250275','2018-03-28 11:24:27.025029'),
(1379,421433212716318721,1,'to timely',318127386367623170,421433212716318721,'2018-03-29 19:21:17.7465563','2018-03-28 19:21:17.7465584'),
(1380,346513954966863872,1,'t',318127386367623170,346513954966863872,'2018-03-29 19:42:23.4758798','2018-03-28 19:42:23.4758816'),
(1381,272735316002209792,1,'t!daily',318127386367623170,272735316002209792,'2018-03-29 21:01:47.5616218','2018-03-28 21:01:47.5616236'),
(1382,298272937243312132,1,'timely',318127386367623170,298272937243312132,'2018-03-29 23:18:02.8826873','2018-03-28 23:18:02.8826891'),
(1383,332340162774302720,1,'t',318127386367623170,332340162774302720,'2018-03-30 01:55:21.4704139','2018-03-29 01:55:21.4704156'),
(1384,367165474246754314,1,'tatyahaksodoeo',318127386367623170,367165474246754314,'2018-03-30 03:46:18.8805182','2018-03-29 03:46:18.8805196'),
(1385,290086674761908225,1,'timely',318127386367623170,290086674761908225,'2018-03-30 07:02:33.4115303','2018-03-29 07:02:33.4115321'),
(1386,168064128500367360,1,'timely',318127386367623170,168064128500367360,'2018-03-30 07:19:09.1915867','2018-03-29 07:19:09.1915885');
必须更改为使用(方括号,单引号或双引号或重音符号可用于括起/包装/引用有问题的关键字): -
.......INSERT INTO `Reminders` (Id,ChannelId,IsPrivate,Message,ServerId,UserId,[When],DateAdded) ......
作为一项练习,我尝试过上述操作,并设法从71个表中获得67个(70个表中的66个,因为 sqlite_sequence 是自动创建的)。
但是,分会表与 DiscordUser 表之间似乎存在问题。我相信他们之间有一个循环的参考。因此, WaifuInfo 和 WaifuUpdates 依赖于 DiscordUser 表,而 WaifuItem 依赖于 WaifInfo < / strong>即可。此处提到的表格尚未成功复制。
一句警告。如果您尝试使用现有约束创建俱乐部和 DiscordUser ,您可能最终会遇到必须存在的情况。
e.g。如果 DiscordUser 存在但分会则不存在
DROP TABLE IF EXISTS `DiscordUser`;
导致: -
no such table: main.Clubs: DROP TABLE IF EXISTS `DiscordUser`;
如果您随后使用以下方法创建分会并尝试使用非常基本(无约束)的DROP: -
CREATE TABLE IF NOT EXISTS `Clubs` (ID INTEGER PRIMARY KEY);
DROP TABLE IF EXISTS `DiscordUser`;
结果很好: -
Query executed successfully: DROP TABLE IF EXISTS `DiscordUser`; (took 1ms)
现在尝试使用以下方式删除俱乐部: -
--CREATE TABLE IF NOT EXISTS `Clubs` (ID INTEGER PRIMARY KEY);
--DROP TABLE IF EXISTS `DiscordUser`;
DROP TABLE IF EXISTS `Clubs`;
并且您不能 DiscordUser 按照以下方式存在: -
no such table: main.DiscordUser: DROP TABLE IF EXISTS `Clubs`;
因此,我强烈建议您仔细查看约束用法并确保在尝试复制所有表之前纠正问题(我猜这可能是其中的一部分)腐败的原因,但为什么/如何超越我。)
P.S。我使用的方法是(1-6): -
然后是7: -
运行sqlite_master查询,从上面选择所有单元格并复制,然后将结果拖放到电子表格中(除非您尝试使用分隔符,否则可以删除sql列,因为创建被截断)。
PRAGMA integrity_check
,运行以进行检查。copied_table_name
确定DiscordUser / Club表的问题在于Clubs.Ownerid需要DiscordUser。因此,如果没有相关的Discord用户(id为1,2,7,14和32),则无法添加俱乐部。一些DiscordUsers是俱乐部成员,所以他们需要俱乐部存在。
我所做的是为俱乐部所有者加载DiscordUsers行,将其ClubId更改为null。加载俱乐部。更新DiscordUsers的ClubId,使他们成为之前俱乐部的成员(即取消null)并加载其余近600个Discordusers(不包括那些已经加载的)。
这是我用于该部分的SQL(除了Discorduser,Clubs和3个waifu表之外,所有其他表都已成功创建并加载)。
INSERT INTO `DiscordUser` (Id,AvatarId,Discriminator,UserId,DateAdded,Username,ClubId,LastLevelUp,NotifyOnLevelUp,LastXpGain,TotalXp,IsClubAdmin,CurrencyAmount) VALUES
-- ClubId was 6 changed to null
(1,'6d5212a0f5e862d57c8ffc6f254a2e85','1458',299779864045682689,'2017-10-07 18:02:04.8287878','Anubis',NULL,'2018-03-27 02:22:26.362966',0,'2017-11-17 01:19:14.0313957',7056,1,280),
-- Owns a club but not in a club
(2,'3b37e0f635706f81fdde2b6de9889283','9810',181200115539640321,'2017-10-07 18:04:39.767728','AnnaHime',NULL,'2018-01-02 02:27:38.8011863',0,'2017-11-16 01:29:49.0371488',429,0,360),
-- ClubId null was 3
(7,'612c67b6eb57d8806dcc92ed45b3a6d0','0396',177502331582021639,'2017-10-07 18:11:09.7830603','Tsuchimursu',NULL,'2018-03-28 17:45:53.7399883',0,'2017-11-17 15:53:59.084885',18156,1,4725),
-- ClubId null was 4
(14,'b2dd362171277337294de325bf92ad6a','3267',215597863441268737,'2017-10-07 18:45:54.8092675','LaLa☆Star',NULL,'2018-01-14 20:52:15.7531274',0,'2017-11-08 19:00:22.7778305',2061,1,286),
-- ClubId null was 5
(32,'667f4d802b977c4d4be974e35ae63c55','2593',251689019929395200,'2017-10-08 00:58:16.6089546','username',NULL,'2018-03-28 07:27:34.9348084',0,'2017-11-17 20:02:14.0283998',4704,1,1188),
-- ClubId was 2 changed to NULL
(91,'0adb399c9f2cd94370038e2452ab8c8d','6790',346513954966863872,'2017-10-13 05:48:51.7788964','mayoi',NULL,'2018-03-24 02:50:06.8970518',0,'2017-11-17 20:01:29.0692552',7635,1,515)
;
INSERT INTO `Clubs` (Id,DateAdded,Discrim,ImageUrl,MinimumLevelReq,Name,OwnerId,Xp,Description) VALUES
(2,'2017-11-14 07:39:57.5091592',1,'https://lh3.googleusercontent.com/_7WKFouxTx1fdFpnmmuykDAd5SoiiJOPzHdRmXKOmRRZhV5Ba4V_kZct5ooVjQ9BuzU=w300',5,'We ⤠waifus',91,40137,'Love your waifus short & tall, big & small, cute as dolls, we love ''em all!'),
(3,'2017-12-11 07:00:59.3762914',1,'',30,'Den of Faes',7,11607,NULL),
(4,'2017-12-11 07:03:59.093402',1,'',5,'Skeleton Enthusiasts',14,657,NULL),
(5,'2017-12-11 07:05:56.9111719',1,'',5,'Saki''s Juice',32,2610,NULL),
(6,'2017-12-22 04:46:24.7271709',1,'',5,'nap pile',1,24870,'For the sleeping beauties and the wandering insomniacs who enjoy a good night sleep.')
;
UPDATE `DiscordUser` SET ClubId = 6 WHERE Id=1;
UPDATE `DiscordUser` SET ClubId = 3 WHERE Id=7;
UPDATE `DiscordUser` SET ClubId = 4 WHERE Id=14;
UPDATE `DiscordUser` SET ClubId = 5 WHERE Id=32;
UPDATE `DiscordUser` SET ClubId = 2 WHERE Id=91;
-- LOAD Remaining DiscordUser rows (note incomplete)
INSERT INTO `DiscordUser` (Id,AvatarId,Discriminator,UserId,DateAdded,Username,ClubId,LastLevelUp,NotifyOnLevelUp,LastXpGain,TotalXp,IsClubAdmin,CurrencyAmount) VALUES
--(1,'6d5212a0f5e862d57c8ffc6f254a2e85','1458',299779864045682689,'2017-10-07 18:02:04.8287878','Anubis',6,'2018-03-27 02:22:26.362966',0,'2017-11-17 01:19:14.0313957',7056,1,280),
--(2,'3b37e0f635706f81fdde2b6de9889283','9810',181200115539640321,'2017-10-07 18:04:39.767728','AnnaHime',NULL,'2018-01-02 02:27:38.8011863',0,'2017-11-16 01:29:49.0371488',429,0,360),
(3,'a3cd92d397ad357834d0e6c9f10bfc59','0429',145356302347010048,'2017-10-07 18:04:49.786657','Rebel Lucy',NULL,'2018-03-26 12:55:21.1149964',0,'2017-11-17 22:21:24.0263741',6876,0,3600),
(4,'7225dccaab1c93896657a61e18595378','5286',84689434536050688,'2017-10-07 18:05:44.765554','scarletflame234',NULL,'2018-03-28 22:56:28.7427437',0,'2017-11-17 23:21:41.4446535',13368,0,288),
(5,'c1316bc0673f4a2709b3ce550ed54395','0760',303279191116480514,'2017-10-07 18:06:39.7664015','zachary',NULL,'2018-03-02 03:48:43.4817755',0,'2017-11-17 18:44:14.1082867',210,0,50),
(6,'2ed95eae7c3088c46b23e71578dacc42','8801',161369834314137601,'2017-10-07 18:07:04.7672808','Kou',NULL,'2018-03-07 06:24:32.3405246',0,'2017-11-17 23:20:00.0648699',2640,0,55),
--(7,'612c67b6eb57d8806dcc92ed45b3a6d0','0396',177502331582021639,'2017-10-07 18:11:09.7830603','Tsuchimursu',3,'2018-03-28 17:45:53.7399883',0,'2017-11-17 15:53:59.084885',18156,1,4725),
(8,'5b1d239935ab4dd6d3eee98954601d52','9859',179093512610906113,'2017-10-07 18:13:54.7939334','TheCorty',NULL,'2017-11-12 12:07:36.4752178',0,'2017-11-12 23:47:26.4744132',2460,0,205), ...........
注意我还加载了未完成的3个waifu表,以便可以检索所有数据(假设没有因为损坏而丢失)。 PRAGMA integrity_check;
返回OK。