插入或更新sqlite3

3
我这里遇到了一个小问题。我有一个表格,其中有多个列,但我的目标是编写一条SQLite查询语句,以便在我的Python脚本中使用。如果找不到键,则可以插入;否则,更新其他值。我进行了一些研究并发现了这个 答案,但我的问题是它无法正常工作,即使数据已存在,它仍会继续添加新行。
基于此答案,我编写了一个查询,因为我的更新/插入取决于一个名为id的列,它是与该表相关的外键约束。 我想要更新的其他两个列的名称和角色。因此,如果不存在id,则要插入所有三个,如果已存在,则要查看其他两个列是否具有相同的值,并对其进行更新。以下是我的尝试: INSERT OR REPLACE INTO tblExample(id, name, role) VALUES (COALESCE((SELECT id FROM tblExample WHERE id = 1),'1'),'name','role'); 但它仍然在插入新行。为什么?如何避免这种情况?是否有更简单的解决方案?
2个回答

1

有几个要点:

  1. 重复项检测基于插入表的 PRIMARY KEY 定义。如果您没有明确在表上定义主键,则将使用唯一的 ROW_ID 值(并且您将始终获得新行)。这个表的 PRIMARY KEY 是什么?

  2. INSERT OR REPLACE 真正替换了该行,而不是更新它。这意味着,如果检测到重复项并选择了替换路径,则语句中未给定值的任何列都将更新为它们的 DEFAULT 值或者如果未指定 DEFAULT 值则更新为 NULL。换句话说,如果您的表有一个名为 city 的额外列,并且替换了一行,则 city 将为 NULL,而不是原始行中的任何值。


该表具有自己的主键,它是自动递增的。我想要使用的ID是指向该表的外键。@larry - user9517536248
INSERT OR REPLACE 只会使用主键进行重复项解决(实际上,它将使用任何唯一键)。 它不能使用 FOREIGN KEY,因为它们不是唯一的,并且如果需要替换行,则无法告诉引擎应替换哪一行。 如果 FOREIGN KEY 也是唯一的,则还需要在其上创建 UNIQUE INDEX。 - Larry Lustig
我对SQLite还很陌生,所以我使用了在SQL Server上创建数据库的方式,并在这里实现了它...所以我的所有表都只有一个自增主键、一个外键和一些列。我使用外键进行插入,因为这是我从另一个源获取值的方法。如果您有任何替代方案可以建议我避免这个问题,我将不胜感激! - user9517536248
我没有一个合格的唯一列,除了主键本身。其他所有列都可以重复甚至为空。 - user9517536248
让我们在聊天室中继续讨论此话题。 - user9517536248
显示剩余3条评论

0

这应该可以工作,但是诀窍在于确保您的id(我假设是此表的主键)与现有id匹配,否则它将不会将其视为重复记录。


不是的,它是表的外键,而主键是一个单独的列。 - user9517536248

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接