2013-05-10 2 views
18

pgsql에서 여러 값의 테이블을 가지며 그 중 하나 (예 : other_id)를 선택하고 가장 높은 값을 찾은 다음 새 항목을 모두 작성하는 방법이 있습니까? 이 값에서 테이블 증가에 넣습니다.연속 열의 데이터 유형을 변경하십시오.

나는이 작업의 기회를 갖고있는 너무 쉬웠다 가정

..

ALTER TABLE address ALTER COLUMN new_id TYPE SERIAL 

____________________________________ 
ERROR: type "serial" does not exist 

어떤 통찰력을위한 많은 감사합니다!

+1

어쩌면 당신은 아마도 이미 기본 키가 테이블에 새 일련 ID를 추가해야하는 이유에 대해 좀 더 설명 할 수 :

CREATE TABLE tablename ( colname SERIAL ); 

이 지정하는 것과 같습니다? 기존 프라이 머리 키를 시리얼 식별자로 대체 하시겠습니까? 이 모든 배경은 무엇입니까? –

+0

@CraigRinger 지난 질문에서 DB를 가져 오는 데 문제가있었습니다. 내일 업무 시간 중에 시스템을 업그레이드하려면 시스템에 상당한 업그레이드가 필요하다고 결정했습니다. 내가 액세스해야하는 테이블이 몇 개 있습니다. 그래서 테이블을 가져 왔지만 그 테이블 내에서 증가하는 열을 제어하는 ​​시퀀스가 ​​전송 문제를 일으키는 것입니다. 행운을 기본 키로 변경하지 않아 테이블의 현재 최고 값으로 시작하여 "직렬"로 만들 수 있다고 생각했습니다. 새로운 열을 만들어서 PrimKey로 만드는 것이 더 쉬울까요? – 1252748

+0

관련 문맥에 필요한 이전 질문에 링크하는 것이 가장 좋습니다. 그걸 어떻게 옮겼 니? 어떤 의미에서 "행운이 없었습니까?" 정확한 명령, 정확한 오류 메시지 등. –

답변

12

docs에서 순간적

The data types smallserial, serial and bigserial are not true types but merely a notational convenience for creating unique identifier columns

당신, 그냥 손으로 순서를 만들 "직렬"로 작동하는 기존의 (정수) 열을 확인하려면이 (이름이 임의 있음을 알려줍니다), 현재 값을 현재 address.new_id 값의 최대 값 (또는 큰 값)으로 설정하고 address.new_id 열의 기본값으로 설정하십시오.

시퀀스의 값을 설정하려면 here을 참조하십시오.

SELECT setval('address_new_id_seq', 10000);

이 자신의 시퀀스 이름 (임의의, 당신이 그것을 만들 수), 그리고 컬럼의 최대 전류 값보다 큰 숫자를 사용, 그냥 예입니다.


업데이트 : 루카스의 대답에 의해 지적합니다 (acccepted 일해야하는) 당신은 또한 지정해야 순서가있는 컬럼 PostgreSQL의 문서에 CREATE/ALTER SEQUENCE ... OWNED BY ...

+0

괜찮습니다. "시퀀스의 현재 값 설정"은 무엇을 의미합니까? 나는 지금 시퀀스를 조사하고있다. 그러나 그들은 나에게 새로운 것이다. 시퀀스를 통해 고유 한 식별자 열에 대한 고유 한 "표기법 편의성"을 만들 수 있다고 말하는 것입니까? – 1252748

+0

직렬 (의사) 유형의 열은 일부 값의 값을 기본값으로 가지며 증가시키는 정수 열입니다. 나는 값을 설정하는 문장을 추가했다. – leonbloy

25

봐를 사용하여 "속으로" datatype serial입니다. 시리얼은 짧은 손에 불과합니다.

CREATE SEQUENCE tablename_colname_seq; 
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq') 
); 
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname; 
+0

postgre의 고대 버전을 (방금 발견 한 방법으로) 업그레이드 할 수있을 때까지 이것이 빠른 수정이라고 언급 했어야합니다. 'OWNED BY'를 시도 할 때 문법 오류가 발생합니다 .. – 1252748

+0

@thomas, 그래서 당신의 postgres 버전은 무엇입니까? – Lucas

관련 문제