2013-04-01 3 views
14

저는 테이블 플레이어와 character (7) 인 기본 키 playerID를 가지고 있습니다. 나는이 테이블에 이미 일부 레코드를 가지고 있으며, 외래 키로 playerID가있는 다른 테이블을 가지고 있으며, 테이블에는 이미 일부 레코드가 있습니다.기본 키를 자동 증가로 변경합니다.

어떻게 playerID를 자동 증가로 설정할 수 있습니까? 독서를 한 후에 처음부터이 일을해야한다고 생각합니다.하지만 지금은 할 수 없기 때문에 어쨌든 할 수 있습니까? 나는 기존의 playerID을 떨어 뜨리면

ERROR: multiple primary keys for table "player" are not allowed 

하고, 그것을 참조하는 다른 테이블의 레코드뿐만 아니라 삭제됩니다 :이

ALTER TABLE player ADD COLUMN key_column BIGSERIAL PRIMARY KEY; 

가 오류를 반환 실행 예를 들어

, .

기존 기본 키인 playerID를 자동 증분으로 "변경"할 수 있습니까?

답변

31

를 변경하는 테이블 나는 그것을 알아낼 만든 동일한 DB 사용자 사용하여 변경 만들려고 노력하고 있는지 확인 : 그냥 자동 증가 기본을 추가를 playerID 가치 :

create sequence player_id_seq; 
alter table player alter playerid set default nextval('player_id_seq'); 
Select setval('player_id_seq', 2000051); --set to the highest current value of playerID 
1

하나의 테이블에 2 개의 기본 키가있을 수는 없으며 playerID 데이터 유형이 character (7)이기 때문에 자동 증가로 변경할 수 있다고 생각하지 않습니다.

그래서 새로운 기본 키를 추가하려면 playerID의 기본 키 제약 조건을 제거해야한다고 생각합니다.

이미 테이블에 데이터가 있으므로 playerID를 다른 테이블의 외래 키로 사용하고 있으므로 플레이어 테이블을 복제하고 두 번째 테이블에서 이러한 변경 사항을 테스트하여 데이터 손상을 방지 할 것을 권장합니다.

하지만이 모든 시도하기 전에, 당신이 당신이

5
DROP SCHEMA tmp CASCADE; 
CREATE SCHEMA tmp ; 
SET search_path=tmp; 

    -- create som data to play with 
CREATE TABLE bagger 
     (player_id CHAR(6) 
     , tralala varchar 
     ); 

    -- populate the table 
INSERT INTO bagger(player_id,tralala) 
SELECT gs::text, 'zzz_' || gs::text 
FROM generate_series(1,10) gs 
     ; 

SELECT * FROM bagger; 

    -- 
    -- create the sequence, change the datatype and bind it to the sequence 
    -- 
CREATE SEQUENCE player_id_seq; 
ALTER TABLE bagger 
     ALTER COLUMN player_id TYPE INTEGER USING player_id::integer 
     , ALTER COLUMN player_id SET NOT NULL 
     , ALTER COLUMN player_id SET DEFAULT nextval('player_id_seq') 
     ; 
ALTER SEQUENCE player_id_seq 
     OWNED BY bagger.player_id 
     ; 
    -- 
    -- reset the sequence to containe the maximum occuring player_id in the table 
    -- 
SELECT setval('player_id_seq', mx.mx) 
FROM (SELECT MAX(player_id) AS mx FROM bagger) mx 
     ; 
SELECT * FROM bagger; 
\d bagger 

출력 :

DROP SCHEMA 
CREATE SCHEMA 
SET 
CREATE TABLE 
INSERT 0 10 
player_id | tralala 
-----------+--------- 
1   | zzz_1 
2   | zzz_2 
3   | zzz_3 
4   | zzz_4 
5   | zzz_5 
6   | zzz_6 
7   | zzz_7 
8   | zzz_8 
9   | zzz_9 
10  | zzz_10 
(10 rows) 

CREATE SEQUENCE 
ALTER TABLE 

setval 
-------- 
    10 
(1 row) 

player_id | tralala 
-----------+--------- 
     1 | zzz_1 
     2 | zzz_2 
     3 | zzz_3 
     4 | zzz_4 
     5 | zzz_5 
     6 | zzz_6 
     7 | zzz_7 
     8 | zzz_8 
     9 | zzz_9 
     10 | zzz_10 
(10 rows) 

           Table "tmp.bagger" 
    Column |  Type  |      Modifiers      
-----------+-------------------+----------------------------------------------------- 
player_id | integer   | not null default nextval('player_id_seq'::regclass) 
tralala | character varying | 
관련 문제