2014-05-10 3 views
3

테이블을 삭제하지 않고 기존 기본 키 유형을 int에서 serial로 변경할 수 있습니까? 나는 이미 테이블에 많은 데이터를 가지고 있으며 그것을 삭제하고 싶지 않습니다.기본 키 int 유형을 직렬로 변경

답변

19

정수를 연속되는 more or less only means adding a sequence default to the value으로 변환하여 연속으로 만듭니다.


  • CREATE SEQUENCE test_id_seq MINVALUE 3 (당신을 가정 (좋은 이름입니다 tablename_columnname_seq) 테이블에있는 값보다 큰
    SELECT MAX(id)+1 FROM mytable

  • 일련의 시퀀스를 생성, 일련의 시작 값을 선택 3에서 시작하기를 원합니다

  • 시퀀스를 사용하도록 열의 기본값을 변경하십시오.
    ALTER TABLE test ALTER id SET DEFAULT nextval('test_id_seq')

  • 테이블/컬럼이 소유 할 시퀀스를 변경하십시오.

A very simple SQLfiddle demo ALTER SEQUENCE test_id_seq OWNED BY test.id

.

그리고 언제나처럼는 인터넷 ;-)

-1
-- temp schema for testing 
-- ---------------------------- 
DROP SCHEMA tmp CASCADE; 
CREATE SCHEMA tmp ; 
SET search_path=tmp; 

CREATE TABLE bagger 
     (id INTEGER NOT NULL PRIMARY KEY 
     , tralala varchar 
     ); 

INSERT INTO bagger(id,tralala) 
SELECT gs, 'zzz_' || gs::text 
FROM generate_series(1,100) gs 
     ; 

DELETE FROM bagger WHERE random() <0.9; 
-- SELECT * FROM bagger; 

     -- CREATE A sequence and tie it to bagger.id 
     -- ------------------------------------------- 
CREATE SEQUENCE bagger_id_seq; 
ALTER TABLE bagger 
     ALTER COLUMN id SET NOT NULL 
     , ALTER COLUMN id SET DEFAULT nextval('player_id_seq') 
     ; 
ALTER SEQUENCE bagger_id_seq 
     OWNED BY bagger.id 
     ; 
SELECT setval('bagger_id_seq', MAX(ba.id)) 
FROM bagger ba 
     ; 

    -- Check the result 
    -- ------------------ 
SELECT * FROM bagger; 

\d bagger 
\d bagger_id_seq 
무작위 명에서 SQL 쿼리를 변경 실행 전에 전체 백업 을 실행하는 습관을