2013-04-01 4 views
14

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

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

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

ALTER TABLE player ADD COLUMN key_column BIGSERIAL PRIMARY KEY; 

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

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

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

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

ответ

31

Я это цифра: просто добавить автоматическое приращение по умолчанию значение в 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 первичных ключа в одной таблице, а так как тип данных игрокаID - это символ (7), я не думаю, что вы можете изменить его на автоматическое приращение.

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

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

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

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 | 
Смежные вопросы