【发布时间】:2014-06-28 00:13:06
【问题描述】:
有没有办法在不删除表的情况下将现有的主键类型从 int 更改为 serial?我的表中已经有很多数据,我不想删除它。
【问题讨论】:
标签: postgresql primary-key auto-increment
有没有办法在不删除表的情况下将现有的主键类型从 int 更改为 serial?我的表中已经有很多数据,我不想删除它。
【问题讨论】:
标签: postgresql primary-key auto-increment
将 int 转换为串行 more or less only means adding a sequence default to the value,从而使其成为串行;
为序列选择一个起始值,大于表中任何现有值SELECT MAX(id)+1 FROM mytable
为序列创建一个序列(tablename_columnname_seq 是个好名字)CREATE SEQUENCE test_id_seq MINVALUE 3(假设你想从 3 开始)
更改列的默认值以使用序列ALTER TABLE test ALTER id SET DEFAULT nextval('test_id_seq')
更改表/列所拥有的序列;ALTER SEQUENCE test_id_seq OWNED BY test.id
和往常一样,养成运行完整备份的习惯在运行来自 Internet 上随机人员的更改 SQL 查询 ;-)
【讨论】:
ALTER SEQUENCE test_id_seq OWNED BY test.id 查询很重要?我的架构不匹配,所以无法运行。
-- temp schema for testing
-- ----------------------------
DROP SCHEMA tmp CASCADE;
CREATE SCHEMA tmp ;
SET search_path=tmp;
CREATE TABLE bagger
( id INTEGER NOT NULL PRIMARY KEY
, tralala varchar
);
INSERT INTO bagger(id,tralala)
SELECT gs, 'zzz_' || gs::text
FROM generate_series(1,100) gs
;
DELETE FROM bagger WHERE random() <0.9;
-- SELECT * FROM bagger;
-- CREATE A sequence and tie it to bagger.id
-- -------------------------------------------
CREATE SEQUENCE bagger_id_seq;
ALTER TABLE bagger
ALTER COLUMN id SET NOT NULL
, ALTER COLUMN id SET DEFAULT nextval('player_id_seq')
;
ALTER SEQUENCE bagger_id_seq
OWNED BY bagger.id
;
SELECT setval('bagger_id_seq', MAX(ba.id))
FROM bagger ba
;
-- Check the result
-- ------------------
SELECT * FROM bagger;
\d bagger
\d bagger_id_seq
【讨论】: