我有一个sqlite表: 例如
CREATE TABLE TEST (id integer primary key, number integer unique, name text);
但是,我需要在更新时自动增加id字段来进行REPLACE。
例如:THE TABLE IS EMPTY
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
有没有人知道如何做到这一点?
答案 0 :(得分:8)
使用单个命令无法做到这一点。
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')")
答案 1 :(得分:1)
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
但是您需要为每个字段指定要用违反唯一约束(称为“已排除”)的行中的值替换表中的值。
不幸的是,据我所知,除了一个字段外,没有其他方法可以更新所有字段。