如果不存在则插入其他更新?

2024-04-24 20:25:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经为经典的“如果已经存在,如何插入新记录或更新新记录”找到了一些“可能是”的解决方案,但是我无法让它们中的任何一个在SQLite中工作。

我有一个表定义如下:

CREATE TABLE Book 
ID     INTEGER PRIMARY KEY AUTOINCREMENT,
Name   VARCHAR(60) UNIQUE,
TypeID INTEGER,
Level  INTEGER,
Seen   INTEGER

我要做的是添加一个具有唯一名称的记录。如果名称已经存在,我想修改字段。

有人能告诉我怎么做吗?


Tags: keyname名称idsqlite定义create记录
3条回答

您需要在表上设置一个约束来触发“conflict”,然后通过执行replace来解析它:

CREATE TABLE data   (id INTEGER PRIMARY KEY, event_id INTEGER, track_id INTEGER, value REAL);
CREATE UNIQUE INDEX data_idx ON data(event_id, track_id);

然后您可以发布:

INSERT OR REPLACE INTO data VALUES (NULL, 1, 2, 3);
INSERT OR REPLACE INTO data VALUES (NULL, 2, 2, 3);
INSERT OR REPLACE INTO data VALUES (NULL, 1, 2, 5);

“从数据中选择*”将为您提供:

2|2|2|3.0
3|1|2|5.0

注意data.id是“3”而不是“1”,因为REPLACE执行删除和插入操作,而不是更新操作。这也意味着您必须确保定义了所有必需的列,否则将得到意外的空值。

看看http://sqlite.org/lang_conflict.html

你想要这样的东西:

insert or replace into Book (ID, Name, TypeID, Level, Seen) values
((select ID from Book where Name = "SearchName"), "SearchName", ...);

请注意,如果该行已存在于表中,则插入列表中的任何字段都将设置为空。这就是为什么对ID列有一个子选择:在替换情况下,语句会将其设置为NULL,然后分配一个新的ID。

如果要在替换情况下保留行而在插入情况下将字段设置为空,则也可以使用此方法。

例如,假设您想让Seen单独存在:

insert or replace into Book (ID, Name, TypeID, Level, Seen) values (
   (select ID from Book where Name = "SearchName"),
   "SearchName",
    5,
    6,
    (select Seen from Book where Name = "SearchName"));

您应该使用INSERT OR IGNORE命令,然后使用UPDATE命令: 在下面的示例中,name是主键:

INSERT OR IGNORE INTO my_table (name, age) VALUES ('Karen', 34)
UPDATE my_table SET age = 34 WHERE name='Karen'

第一个命令将插入记录。如果记录存在,它将忽略由于与现有主键冲突而导致的错误。

第二个命令将更新记录(现在确实存在)

相关问题 更多 >