Zmień klucz podstawowy na auto increment

Mam gracza stołowego i kluczowy identyfikator gracza, który jest postacią(7). Mam już kilka rekordów w tej tabeli, a także kilka innych tabel, które mają playerID jako klucz obcy, a te tabele również mają kilka rekordów już.

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

Na przykład, kiedy biegam to

ALTER TABLE player ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

Zwraca błąd:

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

I jeśli upuszczę istniejący playerID, rekordy w innych tabelach, które odwołują się do niego, również zostaną usunięte.

Czy istnieje sposób, aby "zmienić" istniejący identyfikator odtwarzacza klucza podstawowego na auto increment?

Author: Chin, 2013-04-01

3 answers

Rozgryzłem to: po prostu dodaj domyślną wartość auto-increment 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
 35
Author: Chin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-01 18:06:49
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ście:

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 | 
 5
Author: wildplasser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-01 18:49:57

Nie sądzę, że możesz mieć 2 podstawowe klucze w jednej tabeli, a ponieważ typ danych playerID to character (7), nie sądzę, że możesz go zmienić na auto increment.

Więc uważam, że będziesz musiał usunąć ograniczenie klucza podstawowego na playerID, jeśli chcesz być w stanie dodać nowy klucz podstawowy.

Ponieważ masz już dane na swoim stole i używasz playerID jako klucza obcego w innych stołach, radzę ci zduplikować swój stół gracza i przetestować te zmiany na drugim tabela, aby uniknąć uszkodzenia danych.

Ale zanim spróbujesz tego wszystkiego, upewnij się, że próbujesz wprowadzić te zmiany za pomocą tego samego użytkownika db, który utworzył zmieniane tabele

 1
Author: Ferox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-01 17:59:17