24

私はテーブル Player と character(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 を自動インクリメントに「変更」する方法はありますか?

4

4 に答える 4

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 | 
于 2013-04-01T18:34:29.273 に答える
1

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

したがって、新しい主キーを追加できるようにするには、playerID の主キーの制約を削除する必要があると思います。

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

ただし、これらすべてを試す前に、変更するテーブルを作成したのと同じ db-user を使用してこの変更を加えようとしていることを確認してください

于 2013-04-01T17:59:17.757 に答える