4

我有一个 sqlite 表:例如

CREATE TABLE TEST (id integer primary key, number integer unique, name text); 

但是,我需要在更新时不自动增加 id 字段来进行替换。

例如:表是空的

REPLACE INTO TEST (null, 23, 'Bill');
REPLACE INTO TEST (null, 52, 'Jack');

当我执行查询时,SELECT * FROM TEST;我得到...

1|23|Bill
2|52|Jack

如果我做...

REPLACE INTO TEST VALUES (null, 52, 'John');

SELECT * FROM TEST; 我得到的查询..

1|23|Bill
3|52|John

但是我需要...

1|23|Bill
2|52|John

有谁知道如何做到这一点?

4

2 回答 2

10

这对于单个命令是不可能的。

REPLACE总是在插入新记录之前删除旧记录(如果存在)。

要保留自动增量值,您必须保留记录。也就是说,更新旧记录,并仅在不存在旧记录时插入新记录:

db.execute("UPDATE Test SET Name = 'John' WHERE Number = 52")
if affected_records == 0:
    db.execute("INSERT INTO Test(Number, Name) VALUES(52, 'John')")
于 2013-06-05T15:20:36.307 回答
3

SQLite3 用户的迟到答案:现在有可能,但如果你有很多字段,这意味着需要大量的写作。

您可以使用 INSERT ... ON CONFLICT DO UPDATE 而不是 REPLACE:

INSERT INTO TEST (number, name) VALUES (52, 'John')
ON CONFLICT(number) DO UPDATE
SET number=excluded.number, name=excluded.name;

然后你得到你的结果:

1|23|Bill
2|52|John

但是您需要为每个字段指定您希望将表中的值替换为违反唯一约束(称为“排除”)的行中的值。

不幸的是,除了一个之外,没有办法(据我所知)更新所有字段。

于 2020-04-19T07:57:21.563 回答