2016-06-27 3 views
2

PostgreSQL은 "INSERT ... ON CONFLICT UPDATE"구조를 가지고 있지만, 대부분의 경우 내 쿼리에서 UPDATE가 필요합니다.PostgreSQL : 업데이트 ... 누락 삽입물에?

그래서 DB가 삽입을 시도한 다음 업데이트 만 시도하고 싶습니다. 시도 할 것이고 UPDATE이고 레코드가 존재하지 않는다면 - INSERT이됩니다.

가능합니까? 성능이 향상됩니까?

+0

은 무엇 그걸로 얻을 것으로 기대합니까? –

+0

내 상황에서 성공할 가능성이 큰 첫 번째 업데이트를 시도 할 것이기 때문에 성능이 향상 될 것으로 예상합니다. –

+0

행의 수가 0이면 INSERT .. ON CONFLICT UPDATE를 수행 할 수 있습니다. 실제 데이터와 방법을 비교하여 속도가 빠른지 확인하십시오. –

답변

0

성능이 향상되며 사용 코드에 따라 달라집니다. 테이블을 구성한 다음 별도의 함수를 사용하여 추가 할 데이터가 있는지 여부를 확인한 다음 적절하게 수행하십시오 (존재하는 경우 insert else no). 이 경우 코드가 메모리의 일부를 차지합니다.

+0

함수없이 단일 SQL 문으로 수행 할 수 있습니까? –

+0

네, 물론입니다. Where 문으로 삽입하는 동안이 작업을 수행 할 수 있습니다. 예를 들어 이것을보십시오 : –

0
INSERT INTO hundred(name, name_slug, status) 
SELECT DISTINCT name, name_slug, status 
FROM hundred 
WHERE NOT EXISTS ( 
SELECT 'X' 
FROM temp_data 
WHERE temp_data.name = hundred.name AND temp_data.name_slug = hundred.name_slug AND temp_data.status = status); 

단순화하기 memmory 심지어 작은 부분을 절약하기 위해 대량의 데이터로 작업 할 때이 방법이 좋다 "여기서"문은 당신이 원하는 것을 할 수있는 키 포인트입니다 :

INSERT INTO table (id, field, field2) 
    SELECT 3, 'C', 'Z' 
    WHERE NOT EXISTS (SELECT 1 FROM table WHERE id=3); 
+0

그게 당신이 의미하는 것입니까, @Pavel Bernshtam –

+0

죄송 합니다만, 나는 당신의보기에서 내가 어디서 업데이트를하는지 모르겠습니까? 먼저 테이블을 업데이트하려고합니다. –

+0

UPDATE 테이블 (ID, field, field2) SET ID = 3, 필드 = 'C', field2 = 'Z' WHERE NOT EXISTS (SELECT 1 FROM table WHERE id = 3); –

관련 문제