我正在使用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/