我的数据库是 SQLite,但我确信问题通常适用于 SQL。比如说,我有一个表“students”,其中包含“id”(主键)、“name”、“selected”列。我有时需要从外部源更新所述表,但我只收到一个包含 id 和名称的表。当每行发生所述更新时,我需要:
如果不存在具有相同 id 的行,则将新行添加到表中,默认值为“selected”
如果行已存在,则仅更新“名称”字段,不影响“选定”
这应该通过带有占位符的单个查询批量完成。另外,情况被简化了,实际上我需要编写通用代码来更新一组表,每个表包含几个要更新的字段和几个“本地”字段。
不幸的是,我找不到合适的方式来表达我对 SQLite 的渴望。如果我使用 REPLACE 查询:
INSERT OR REPLACE INTO students (id, name) VALUES (:id, :name)
这将清除“选定”字段,而如果我使用更新:
UPDATE students SET name = :name WHERE id = :id
这不会添加新行。
那么,正确的做法是什么?我有一种感觉,我错过了一些非常非常简单的东西,当我得到答案时,我会感觉非常非常愚蠢:)
INSERT or REPLACE
不具有普遍性。每个数据库都有自己的语法(例如 SQL Server 2005 及更高版本的 MERGE),而且许多数据库并不具备全部语法。对此的通用解决方案是两个语句。
UPDATE students SET name = :name WHERE id = :id
其次是
INSERT INTO Students
(ID, Name)
Values
(:id,:name)
WHERE
Not exists (select * from students where ID= :id)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)