首页 文章

将主键更改为自动增量

提问于
浏览
19

我有一个表Player,以及一个主键playerID,它是character(7) . 我已经在这个表中有一些记录,还有一些其他表有playerID作为外键,这些表也有一些记录 .

如何将playerID设置为自动递增?读完一段时间后,我觉得我应该从一开始就这样做,但既然我现在不能这样做,那么我能做到吗?

例如,当我运行它

ALTER TABLE player ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

它返回一个错误:

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

如果我删除现有的playerID,那么引用它的其他表中的记录也将被删除 .

有没有办法将现有的主键playerID“更改”为自动增量?

3 回答

  • 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
    
  • 42
    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 |
    
  • 5

    我不认为你可以在一个表中有2个主键,并且因为playerID数据类型是字符(7)我不认为你可以将它改为自动增量 .

    因此,如果您希望能够添加新的主键,我相信您必须删除playerID上的主键约束 .

    由于您已经在表上有数据并且在其他表中使用playerID作为外键,我建议您复制播放器表并在第二个表上测试这些更改,以避免损坏您的数据 .

    但在尝试所有这些之前,请确保使用创建要更改的表的相同db-user尝试进行此更改

相关问题