2013-08-19 121 views
3

我在这里面临一个小问题。我有一个多列的表,但我想要写的sqlite查询将用于我的python脚本,以便我可以插入如果找不到密钥或者如果已找到密钥更新其他值。我研究了一下,并通过了这个answer,但我的内容关注我的内容,它不工作,并继续添加新的行,即使它存在。插入或更新sqlite3

使用this我写了一个查询,因为我的更新/插入依赖于称为id的列,这是该表的外键约束。其他两列,我想更新说的名称和角色。所以我想要做的是插入所有三个,如果没有找到id。如果找到,则查看它是否具有相同的值或不是其他两列并更新它。这是我的尝试。

INSERT OR REPLACE INTO tblExample(id, name, role) VALUES (COALESCE((SELECT id FROM tblExample WHERE id = 1),'1'),'name','role');

但它仍然是插入新行。为什么?我怎么能避免它?更简单的解决方案?

回答

0

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

+0

不是,它是表的外键主键是一个单独的列 – user9517536248

1

几件事情:

  1. 重复检测是基于你插入到表的PRIMARY KEY定义。如果您尚未在表格中明确定义主键,则它将使用唯一的ROW_ID值(并且您将始终获得一个新行)。这张桌子的PRIMARY KEY是什么?

  2. INSERT OR REPLACE确实替换了行,而不是UPDATE。这意味着,如果检测到重复且选择了REPLACE通路,则语句中未给定值的任何列将更新为其值或更新为NULL,如果没有指定DEFAULT。换句话说,如果你的表有一个名为city的附加列,并且一行被替换,那么city将是NULL,而不是它在原始行中的值。

+0

该表具有它自己的主键,这是自动增量。我想用来更新的ID是该表的外键@larry – user9517536248

+0

INSERT OR REPLACE将仅使用PRIMARY KEY进行重复分辨率(实际上,它将使用任何唯一键)。它不能使用FOREIGN KEY,因为它们不是唯一的,如果需要更换,它们不会告诉引擎要更换哪行。如果FOREIGN KEY *也是*唯一的,那么您还需要创建一个UNIQUE INDEX。 –

+0

你能为我的问题提供替代解决方案吗? – user9517536248