我有一个表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“更改”为自动增量?
答案 0 :(得分:42)
我弄明白:只需在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 :(得分: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 |
答案 2 :(得分:1)
我认为你不能在一个表中有2个主键,并且因为playerID数据类型是字符(7),所以我认为你不能把它改为自动增量。
因此,如果您希望能够添加新的主键,我必须删除playerID上的主键约束。
由于您已经在表上有数据并且在其他表中使用playerID作为外键,我建议您复制播放器表并在第二个表上测试这些更改,以避免损坏您的数据。
但在尝试所有这些之前,请确保使用创建要更改的表的相同db-user尝试进行此更改
答案 3 :(得分:0)
以下代码将自动递增设置为PGSQL中的现有列:
ALTER TABLE schema.table ALTER COLUMN id
SET DEFAULT nextval('schema.table_id_seq'::regclass);