SQLITE:不使用auto_increment替换

时间:2013-06-05 14:06:29

标签: sqlite replace unique

我有一个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

有没有人知道如何做到这一点?

2 个答案:

答案 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

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

不幸的是,据我所知,除了一个字段外,没有其他方法可以更新所有字段。