我发现了一些经典的“将是”解决方案“我如何插入一个新记录或更新一个如果它已经存在”,但我不能让他们中的任何一个在SQLite中工作。
我有一个定义如下的表:
CREATE TABLE Book
ID INTEGER PRIMARY KEY AUTOINCREMENT,
Name VARCHAR(60) UNIQUE,
TypeID INTEGER,
Level INTEGER,
Seen INTEGER
我要做的是添加一个具有唯一名称的记录。如果Name已经存在,我想修改字段。
有人能告诉我怎么做吗?
Upsert就是你想要的。UPSERT语法在3.24.0版本(2018-06-04)添加到SQLite中。
CREATE TABLE phonebook2(
name TEXT PRIMARY KEY,
phonenumber TEXT,
validDate DATE
);
INSERT INTO phonebook2(name,phonenumber,validDate)
VALUES('Alice','704-555-1212','2018-05-08')
ON CONFLICT(name) DO UPDATE SET
phonenumber=excluded.phonenumber,
validDate=excluded.validDate
WHERE excluded.validDate>phonebook2.validDate;
请注意,在这一点上,实际的单词“UPSERT”不是UPSERT语法的一部分。
正确的语法是
插入…在冲突(…)做更新设置…
如果你正在做INSERT INTO SELECT…你的选择至少需要WHERE为真来解决解析器关于连接语法标记ON的歧义。
请注意INSERT OR REPLACE…如果必须替换记录,将在插入新记录之前删除该记录,如果有外键级联或其他删除触发器,这可能会很糟糕。