2014-04-15 5 views
2

고유해야하는 ID 열이있는 테이블이 PostgreSQL에 있습니다. 그러나 많은 행 (약 3 백만)은 현재 ID가 "1"입니다.증가 값으로 업데이트하는 방법

내가 알고있는 무엇 :

  • 행의 총 수
  • ID 열에
  • "1"
의 (잘못된) ID와 행의 수에 대한 현재의 최대 값

내가 필요한 것은 "1"의 ID를 가진 모든 행을 가져 와서 자동으로 증가하는 새 ID를 할당하여 테이블의 모든 행이 고유 ID를 갖게하는 쿼리입니다. currentMaxId + 1에서 시작하여 각 행에 후속 ID를 할당하고 싶습니다.

이 내가 쿼리를 가까이서 보는 것입니다 :

UPDATE table_name 
SET id = (
    SELECT max(id) FROM table_name 
) + 1 
WHERE id = '1' 

이 문제는 내부 SELECT는 따라서 원래 문제의 행의 ID를 설정, 처음 실행하는 것입니다 max(id) + 1, 매번 새로운 max(id) + 1이 아니며, 해결하려고하는 것과 동일한 문제를 제공합니다.
원하는 결과 또는 대체 방법을 얻기 위해이 쿼리를 조정하는 방법에 대한 제안은 크게 감사하겠습니다.

답변

3

임시 시퀀스로 단계별로 수행 할 수 있습니다.

1) 창조

create temporary sequence seq_upd; 

2) 업데이트 적절한 초기 값

select setval('seq_upd', (select max(id) from table_name)); 

3)로 설정

당신이 SEQUENCE 작업을하려는 경우
update table_name set id=nextval('seq_upd') where id=1; 
+0

예 , 그 덕분에, 고마워! – user3537769

0

, 당신을 위해 serial pseudo data typeid으로 생각하십시오. 그러면 자동으로 최신 상태가 될 "소유"(임시가 아님) 시퀀스에서 nextval()을 그릴 수 있습니다.

당신이 원하지 않는 경우, 당신은 일회성 번호에 대한 ctidrow_number()를 사용하여 다시 떨어질 수 :

UPDATE tbl t 
SET id = x.max_id + u.rn 
FROM (SELECT max(id) AS max_id FROM tbl) x 
    , (SELECT ctid, row_number() OVER (ORDER BY ctid) AS rn 
     FROM tbl WHERE id = 1) u 
WHERE t.ctid = u.ctid; 

관련 대답 dba.SE에 :
numbering rows consecutively for a number of tables

관련 문제