将主键int类型更改为serial

Mar*_*isP 13 postgresql primary-key auto-increment

有没有办法将现有的主键类型从int更改为serial而不删除表?我已经在表中有很多数据,我不想删除它.

Joa*_*son 45

或多或少地将int转换为串行仅意味着将值序列默认添加到值,以使其成为串行;

  • 选择序列的起始值,大于表中的任何现有值
    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

一个非常简单的SQLfiddle演示.

和往常一样,养成运行完整备份的习惯,然后再运行互联网上随机人员的SQL查询;-)

  • @ConnorWilloughby 来自[文档](https://www.postgresql.org/docs/12/datatype-numeric.html#DATATYPE-SERIAL)(对于 PostgreSQL 版本 12)描述了对表列使用 SERIAL 类型的实际效果,“该序列被标记为该列“拥有”,因此如果删除该列或表,该序列也会被删除。” 也就是说,列或表的 DROP 现在将级联,同时也消除序列。方便! (2认同)