Изменение первичного ключа для автоматического увеличения

У меня есть Player Player и идентификатор игрока первичного ключа, который является символом (7). У меня уже есть записи в этой таблице, а также некоторые другие таблицы, в которых есть идентификатор playerID в качестве внешнего ключа, и эти таблицы также имеют некоторые записи.

Как настроить идентификатор игрока для автоматического увеличения? По прочтении какое-то время я думаю, что я должен был сделать это с самого начала, но так как я не могу этого сделать сейчас, я все равно могу это сделать?

Например, когда я запускаю этот

ALTER TABLE player ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

он возвращает ошибку:

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

и если я удалю существующий идентификатор игрока, записи в других таблицах, которые ссылаются на него, также будут удалены.

Есть ли способ "изменить" существующий идентификатор игрока первичного ключа для автоматического увеличения?

Ответы

Ответ 1

Я понял: просто добавьте значение по умолчанию для автоматического увеличения в 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

Ответ 2

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 | 

Ответ 3

Я не думаю, что вы можете иметь 2 первичных ключа в одной таблице, а так как тип данныхIDID - символ (7), я не думаю, что вы можете изменить его на автоматическое увеличение.

Поэтому я считаю, что вам нужно будет удалить ограничение первичного ключа на идентификаторе playerID, если вы захотите добавить новый первичный ключ.

Поскольку у вас уже есть данные в вашей таблице, и вы используете playerID в качестве внешнего ключа в других таблицах, я бы посоветовал вам дублировать таблицу игроков и проверить эти изменения на второй таблице, чтобы не повредить ваши данные.

Но прежде чем пытаться все это, убедитесь, что вы пытаетесь внести эти изменения, используя того же пользователя db, который создал таблицы, которые вы меняете.