2011-01-13 3 views
3

내 데이터베이스는 SQLite이지만 일반적으로 SQL에 적용되는 질문은 확실합니다. 예를 들어, "id"(기본 키), "name", "selected"열이있는 테이블 "students"가 있습니다. 때로는 외부 소스에서 테이블을 업데이트해야하지만 ID 및 이름 테이블 만받습니다. 같은 ID를 가진 행이 존재하지 않는 경우SQL : 새 레코드를 삽입하거나 일부 필드 만 바꾸는 쿼리

  1. 행이 이미 업데이트가 존재하는 경우

  2. "선택"에 대한 기본 값을 테이블에 새 행을 추가 업데이트가 각 행에 대해 발생 말했을 때 나는 필요 이 자리에 하나의 쿼리를 일괄 적으로 수행해야

전용 "이름"필드는 untouching은 "선택". 또한 사례가 단순 해졌고, 실제로 업데이트 할 여러 필드와 여러 "로컬"필드를 포함하는 테이블 세트를 업데이트하기위한 범용 코드를 작성해야합니다.

불행히도 SQLite에 대한 내 욕구를 표현할 수있는 적절한 방법을 찾을 수 없습니다. 내가 REPLACE 사용하는 경우 쿼리

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

내가 UPDATE를 사용하는 경우 동안이의 "선택"필드를 치워 것은 :

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

이 새 행을 추가하지 않습니다.

그래서 올바른 방법은 무엇입니까? 나는 아주 간단한 것을 놓치고있는 느낌이 들었다. 나는 대답을 얻었을 때 매우 바보 같은 느낌이 들었다.

답변

2

INSERT or REPLACE은 보편적이지 않다. 각 DB에는 고유 한 구문이 있습니다 (예 : SQL Server 2005 이상 버전의 경우 MERGE). 이를위한 보편적 인 해결책은 두 가지입니다.

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

내가 일반적으로 왼쪽은 INSERT에 대한 가입 및 DELETE 및 업데이트에 대한 가입 사용

INSERT INTO Students 
(ID, Name) 
Values 
(:id,:name) 
WHERE 
Not exists (select * from students where ID= :id) 
1

하였다. 이는 하나의 큰 쿼리로 발생하며 레코드 기반별로 기록되지 않습니다.

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 
관련 문제