2013-04-01 14 views
14

私はテーブルプレーヤーを持ち、キャラクタ(7)であるプライマリキーplayerIDを持っています。私はすでにこのテーブルにいくつかのレコードを持っており、また、外部キーとしてplayerIDを持っているいくつかの他のテーブルを持っています、そして、それらのテーブルはすでにいくつかのレコードを持っています。プライマリキーを自動インクリメントに変更

playerIDを自動インクリメントに設定するにはどうすればよいですか?私はこれを最初からやっていたはずだと思いますが、今はできないので、やってもらえますか?例えば

、私はこの

ALTER TABLE player ADD COLUMN key_column BIGSERIAL PRIMARY KEY; 

を実行すると、エラーが返されます。

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

を、私は既存のplayerIDをドロップする場合は、それを参照する他のテーブル内のレコードが同様に削除されます。

既存のプライマリキーの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

私は1つのテーブルに2つの主キーを持つことはできないと思います。playerIDデータ型がcharacter(7)なので、あなたはそれを自動インクリメントに変更することはできません。

新しいプライマリキーを追加できるようにするには、playerIDのプライマリキー制約を削除する必要があると思います。

すでにテーブルにデータがあり、他のテーブルの外部キーとしてplayerIDを使用しているので、データを破損しないようにプレーヤテーブルを複製して2番目のテーブルでこれらの変更をテストすることをおすすめします。

しかし、あなたはこのすべて、あなたがこれはあなたが、私はそれを把握

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 | 
関連する問題