2013-04-01 10 views
14

Mam tabelę Odtwarzacz i klucz podstawowy playerID, który jest znak (7). Mam już kilka rekordów w tej tabeli, a także kilka innych tabel, które mają ID gracza jako klucz obcy, a te tabele również mają już pewne rekordy.Zmień klucz podstawowy na auto inkrementacji

Jak ustawić playerID na auto-inkrementację? Po przeczytaniu przez chwilę myślę, że powinienem był to zrobić od samego początku, ale skoro nie mogę tego teraz zrobić, to czy mogę to zrobić?

Na przykład, kiedy uruchomić ten

ALTER TABLE player ADD COLUMN key_column BIGSERIAL PRIMARY KEY; 

zwraca błąd:

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

a jeśli wpadnę istniejącą playerID rekordy w innych tabelach, które go referencyjna zostanie spadła także .

Czy istnieje sposób na "zmianę" istniejącego klucza głównego ID gracza na automatyczny przyrost?

Odpowiedz

31

mi zrozumieć to: wystarczy dodać domyślny automatycznego przyrostu wartość do 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

Nie wydaje mi się, że możesz mieć 2 podstawowe klucze w jednej tabeli, a ponieważ typ danych odtwarzacza to znak (7), nie sądzę, żeby można go było zmienić na auto-przyrost.

Uważam, że konieczne jest usunięcie ograniczenia klucza podstawowego na playerID, jeśli chcesz mieć możliwość dodania nowego klucza podstawowego.

Ponieważ masz już dane na swoim stole i używasz ID gracza jako obcego klucza w innych tabelach, radziłbym duplikować tabelę graczy i testować te zmiany na drugiej tabeli, aby uniknąć uszkodzenia danych.

Ale zanim spróbujesz to wszystko, upewnij się, że staramy się to zmienia się przy użyciu tego samego DB-użytkownik, który utworzył tabele zmieniasz

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 

wyjściowa:

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 | 
Powiązane problemy