2011-09-17 3 views
2

문자열에서 두 개의 정수로 매핑되는 테이블을 상상해보십시오. 키가 테이블에 없으면 새 행을 삽입하거나 정수를 더하여 기존 행을 업데이트하고 싶습니다. (key, oldx+x, oldy+y). 나는이 일을 많이하고있을 것이고, 처음에 SELECT이 있는지 확인한 다음, INSERT 또는 UPDATE이 합계가 2 개의 조회가 될 것 인지를 확인하기 위해 한 작업 대신이 작업을 수행 할 수 있는지 궁금합니다.SQL에서 삽입 또는 업데이트

저는 SQL을 처음 사용하기 때문에 효율적으로이 작업을 수행하는 방법을 알 수 없습니다.

+0

어떤 DBMS를 사용하고 있습니까? PostgreSQL, Oracle, Firebird, DB2, SQL Server, MySQL? –

+0

SQLite + Perl DBI –

답변

4

SQLite는 INSERT OR REPLACE을 지원하며, 대부분의 사람들이 생각하는 것보다 더주의해야합니다. 자세한 내용은 this SO answer을 참조하고 교체하는 동안 계단식 삭제가 발생할 수 있습니다.

1

데이터베이스가 Upsert을 지원하는 방법을 잘 모르겠습니다. 모두를 수행

2

작동합니다

UPDATE TABLE SET x=x+?, y=y+? WHERE key = ?; -- will do nothing if key not found 

INSERT INTO TABLE (key, x, y) 
SELECT ?, ?, ? 
WHERE NOT EXISTS (SELECT * FROM TABLE WHERE key = ?); -- will do nothing if key found 

만 어느 누구도 테이블의 데이터에 영향을 미칠 것입니다.

1
-- Insert record with key=k if it does not exist yet. 
-- the zero's could also be handled by appropiate defaults for oldx,oldy 
INSERT INTO tab (key, oldx, oldy) select k,0,0 
    WHERE NOT EXISTS (SELECT 1 FROM tab where key=k) 
    ; 

UPDATE tab 
    SET oldx=oldx+y, oldy=oldy+y 
    WHERE key = k 
    ; 
+0

이것은 나를 위해 작동하지 않습니다. SELECT WHERE NOT EXISTS는 최종 WHERE 절과 일치하지 않는 데이터베이스의 각 행에 대해 행을 리턴합니다. 결과적으로 새 레코드를 여러 번 삽입합니다. – Michael

관련 문제