SQL:用于插入新记录或仅替换某些字段的查询

时间:2011-01-13 05:24:06

标签: sql sqlite

我的数据库是SQLite,但我确定问题一般适用于SQL。说,我有一个表“学生”,列“id”(主键),“名称”,“选中”。我不时需要从外部源更新所述表,但我只收到一个id和名称表。当我需要对每行进行所述更新时:

  1. 如果不存在具有相同ID的行,则使用“已选择”的默认值向表中添加新行

  2. 如果行已存在,则仅更新“名称”字段,取消选中“已选中”

  3. 这应该在一个带有占位符的单个查询的批处理中完成。此外,案例简化了,实际上我需要编写通用代码来更新一组表,每个表包含几个要更新的字段和几个“本地”字段。

    不幸的是,我找不到合适的方式来表达我对SQLite的渴望。如果我使用REPLACE查询:

    INSERT OR REPLACE INTO students (id, name) VALUES (:id, :name)
    

    这将清除“selected”字段,而如果我使用UPDATE:

    UPDATE students SET name = :name WHERE id = :id
    

    这不会添加新行。

    那么,正确的做法是什么?我有一种感觉,我错过了非常简单的事情,当我得到答案时,我会觉得非常愚蠢:)

2 个答案:

答案 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