我的数据库是SQLite,但我确定问题一般适用于SQL。说,我有一个表“学生”,列“id”(主键),“名称”,“选中”。我不时需要从外部源更新所述表,但我只收到一个id和名称表。当我需要对每行进行所述更新时:
如果不存在具有相同ID的行,则使用“已选择”的默认值向表中添加新行
如果行已存在,则仅更新“名称”字段,取消选中“已选中”
这应该在一个带有占位符的单个查询的批处理中完成。此外,案例简化了,实际上我需要编写通用代码来更新一组表,每个表包含几个要更新的字段和几个“本地”字段。
不幸的是,我找不到合适的方式来表达我对SQLite的渴望。如果我使用REPLACE查询:
INSERT OR REPLACE INTO students (id, name) VALUES (:id, :name)
这将清除“selected”字段,而如果我使用UPDATE:
UPDATE students SET name = :name WHERE id = :id
这不会添加新行。
那么,正确的做法是什么?我有一种感觉,我错过了非常简单的事情,当我得到答案时,我会觉得非常愚蠢:)
答案 0 :(得分:2)
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)
答案 1 :(得分:1)
我通常使用LEFT JOIN进行INSERT,使用DELETE和JOIN进行更新。请注意,它发生在一个大查询中,而不是按记录基数记录:
UPDATE T1
FROM T1 JOIN T2 ON T1.PK = T2.PK
INSERT T1
SELECT
FROM T2 LEFT JOIN T1 ON T2.PK = T1.PK
WHERE T1.PK IS NULL
DELETE T1
FROM T1 LEFT JOIN T2 ON T1.PK = T2.PK
WHERE T2.PK IS NULL