2009-05-15 4 views
2

저는 대량으로 기본적으로 하드 코딩 된 데이터와 동적 사용자 데이터를 배포 한 취미 앱을 개발 중입니다. 하드 코드 된 데이터를 로컬로 업데이트하는 기능이 필요합니다 (UPDATE, INSERT 초 이상). 그런 다음이 데이터를 서버로 내 보냅니다. 즉, 데이터를 파일로 덤프하고 새 행 (비교적 적은 수)이 INSERT ed이고 기존 행 (PK로 식별 됨)이 UPDATE d가되도록 가져와야합니다. 분명히 새 행은 서버에서 INSERT이 될 수 없습니다 (또는 PK가 잠재적으로 충돌하여 오류 UPDATE을 발행 할 수 있음). 이는 허용되는 제한 사항입니다. 그러나 012W는 UPDATE d가 될 수 없습니다. 사용자가 액세스 할 수있는 테이블에는 "정적"테이블에 대한 FK 제약 조건이 있으므로 동기화 된 테이블을 삭제할 수는 없습니다. DELETEPostgreSQL의 기존 행 가져 오기/업데이트

불행히도, 이것은 매우 어려운 것 같습니다. Google과 Postgres 메일 링리스트는 "MySQL과 같은"기능인 on_duplicate_key_update이 "pg_loader can do it"이라는 표시와 함께 새 버전 (부실 정보, 거기에 있습니까?)과 함께 나타납니다. 의 표시가 없음 .

최악의 시나리오에서는 가정용 솔루션 (데이터 파일 덤프, PK 충돌을 확인하고 INSERT 또는 UPDATE 문을 적절히 발행하는 사용자 지정 가져 오기 스크립트 작성)을 제안 할 수 있다고 생각하지만, 다른 사람들이 분명히 나 앞에서 마주 치게되는 문제에 대한 대단히 서투른 해결책으로 보인다.

의견이 있으십니까?

+1

그냥 내 호기심을 위해서 - 서버에서 업데이트/삽입을 할 수없는 이유는 무엇입니까?모든 문제를 해결할 것 같은데. –

+0

나는 할 수 있었다; 가장 큰 이유는 보안입니다 (가정용 시스템으로 핵심 데이터를 공격자에게 노출시키지 않을 것입니다 ...). 그리고 내가 종종 인터넷 연결없이 작업한다는 사실. –

+1

내가 이해하지 못하는 것이 있어야합니다. 편집을 수행하는 위치에 따라 데이터가 더 취약한 이유는 무엇입니까? –

답변

0

로컬로 postgresql을 실행 해 보셨습니까?

  1. 덤프 서버 데이터
  2. 가져 오기 로컬 쿼리 로깅에
  3. 차례
  4. 업데이트를
  5. 테이크 쿼리 로그를 확인하고 서버에서 실행
  6. 지우기 쿼리 로그

또는 AM 네가하려는 일을 오해하니? 다음 새 데이터로

+0

오해 없음 : 확실히 실행 가능한 솔루션입니다 .- 저는 이미 로컬 포스트그레스 서버 (실제로는 랩톱과 데스크톱에 각각 2 개씩)를 실행하고 있습니다. 이상적인 것보다 아기를 더 많이 필요로하는 솔루션처럼 들리지만 (모든 서버 업데이트에서 로그를 관리 및 재설정하고 내 두 로컬 시스템간에 동기화해야하는 경우), 분명히 * 작동 할 것입니다. –

0
create temporary table newdata as select * from table1 where false; 

채우기 newData의 :

아마 일을 일부 조정이 필요합니다, 그래서이 테스트되지
start transaction; 
create function fill_table1() returns void as 
$$ 
declare 
    data record; 
begin 
    for data in select * from newdata 
    loop 
     update table1 set 
      column1 = data.column1, 
      column2 = data.column2 
     where id = data.id 
     if not found then 
      insert into table1 values data.*; 
     end if; 
    end loop; 
end; 
$$ language plpgsql; 
select fill_table(); 
drop function fill_table(); 
commit; 

. 테이블이 실행되는 동안 변경되지 않아야합니다.

2

예, 임시 테이블 + 삽입/업데이트의 일부 조합은 갈 방법입니다 (함수에서 수행 할 필요는 없지만 할 수는 있습니다).

레코드의 경우 찾고있는 기능이 병합 명령입니다. 누군가 그것을위한 패치를 썼지 만 끝내지 않았습니다. AFAIK 아무도 지금은 그것에 노력하고 있지 않습니다; Postgres 8.4가 곧 출시 될 예정은 아닙니다.

0

이 질문은 this 비슷한 것 같다

은 어쩌면 당신은 내가 거기에 제공하는 솔루션을 확인할 수 있습니다.