我正在使用SQLite存储id,uuid,值和捕获的值。

我使用以下命令创建表:

CREATE TABLE IF NOT EXISTS statz_fish_caught
('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
 'uuid' TEXT NOT NULL,
 'value' INTEGER NOT NULL,
 'caught' TEXT NOT NULL);


我使用此命令来插入(或替换)行:

INSERT OR REPLACE INTO statz_fish_caught (uuid,value,caught)
VALUES ('uuid comes here', a number here, 'a certain string').


假设您在表格中有以下数据:

http://pasteboard.co/gofap3y.png

此数据意味着UUID1总共捕获了9条(1 + 5 + 3)条鱼。 1种鱼,1种鱼,2种鱼,3种鱼的3种。UUID2仅捕获了10种鱼的鱼。1现在,让我们想象一下UUID1捕获一种新鱼:鱼种4。数据库应该创建一个新行自动递增的id为5,uuid为'uuid1',value = 1,且catch = fish类型4。

现在,让我们还想象一下,UUID捕获了另一条鱼类型为3的鱼。应该更新鱼类型为3(其id为3)的uuid1行,以表示值4,如下所示:

http://pasteboard.co/goBZatx.png

如果可以,这可能吗?

最佳答案

您正在使用INTEGER AUTOINCREMENT PRIMARY KEY,并且表中没有任何其他UNIQUE字段:这意味着在现有行和您要添加的行之间不可能有冲突,因此将否REPLACE

您应该像这样更改表的定义:

CREATE TABLE IF NOT EXISTS statz_fish_caught
('id' INTEGER PRIMARY KEY NOT NULL,
 'uuid' TEXT NOT NULL,
 'value' INTEGER NOT NULL,
 'caught' TEXT NOT NULL);


请注意,通过更改此设置,添加行时必须手动放置id值,因为该值不再由DBMS管理。

编辑:Here您可以找到一个有效的示例;注意主键的值没有改变。

编辑#2:正如ishmaelMakitla所建议的,将UNIQUE放在UUID字段应该可以解决问题。我已经相应更新了答案。

CREATE TABLE IF NOT EXISTS statz_fish_caught
('id' INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
 'uuid' TEXT NOT NULL UNIQUE,
 'value' INTEGER NOT NULL,
 'caught' TEXT NOT NULL);


警告:如SQLite文档所述,


  AUTOINCREMENT关键字强加了额外的CPU,内存,磁盘空间和磁盘I / O开销,如果没有严格要求,则应避免使用。通常不需要。


另外,如您在this示例中看到的那样,更新行的id已更改,我强烈建议避免这样做。

编辑#3
我花了一段时间,但是this示例应该可以完成您想要的事情。

您必须使用的查询类似于以下内容(6是要添加的捕获的鱼):

INSERT OR REPLACE INTO statz_fish_caught (uuid,value,caught)
VALUES (
     -- (select `id` from statz_fish_caught where uuid = 'uu1'),
     'uu1',
     (select `value` from statz_fish_caught where uuid = 'uu1') + 6,
     (select `caught` from  statz_fish_caught where uuid = 'uu1')
);


请注意,如果要保留更新行的id字段的当前值,则必须取消注释值的第一行,并在语句的列列表中添加id字段。

关于java - SQLite“插入或替换为”错误行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36680560/

10-10 20:08