2009-07-28 13 views
1

기존 응용 프로그램에는 (거의) 중복 행이있는 기본 키가없는 테이블이 있습니다. 다른 시스템과의 통합을 위해 이러한 중복 행을 고유하게 만드는 열을 테이블에 추가해야합니다. 테이블은 본질적으로 :Postgres는 데이터베이스의 고유 한 행을 구별하기 위해 seq #를 추가합니다.

 
+------+---------+--------+ 
| txn# | detail# | amount | 
+------+---------+--------+ 
난 그냥 모든 기존 행에 대해 증가하는 서열 번호를 사용할 수

은, 그러나, 응용 프로그램 변경, 기존의 '거의 키'(기본적으로 거래 # 세부 #)를 가지고하는 것입니다 및 증가 이 조합의 일련 번호 (예를 들어, txn # 1, detail # 1에 대해 두 개의 행을 가지며 첫 번째에 대해 seq # 1을, 두 번째에 대해 seq # 2를 가지며 txn # 513 인 경우 detail # 44는 3 개의 중복 된 행을 가지며, 이것들은 적절하게 seq # 1,2,3을 가질 것입니다. 애플리케이션의 변경 전후의 데이터가 유사하게 설정된 경우 이상적입니다 (지원 관점에서). 이 열을 만들거나 행을 수동으로 순환하여 txn # 또는 detail #이 변경 될 때마다 사용되는 시퀀스를 재설정해야합니까?

덧붙여 추가 :이 응용 프로그램은 PostgreSQL 7.4 & 8.1에 배포되며 솔루션은 두 버전 모두에서 작동해야합니다.

답변

1

당신의 열이 "거의 유일한"인 경우, 나는. 이자형. 각 값의 복제본이 많지 않으므로 다음 구문을 사용할 수 있습니다.

ALTER TABLE mytable ADD seq INT; 

UPDATE mytable mo 
SET  seq = 
     (
     SELECT COUNT(*) 
     FROM mytable mi 
     WHERE mi.txn = mo.txn 
       AND mi.detail = mo.detail 
       AND mi.ctid <= mo.ctid 
     ) 

ALTER TABLE mytable ALTER COLUMN seq SET NOT NULL; 

ALTER TABLE mytable DROP CONSTRAINT t_mytable_pkey; -- the name of your current primary key 

ALTER TABLE mytable ADD CONSTRAINT t_mytable_pkey PRIMARY KEY (txn, detail, seq); 

너무 많은 중복이 없으면이 작업이 빨리 완료됩니다.

+0

감사합니다. ctid 일은 나를 위해 퍼즐의 누락 된 부분이었습니다! –

관련 문제