Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 将主键int类型更改为串行_Postgresql_Primary Key_Auto Increment - Fatal编程技术网

Postgresql 将主键int类型更改为串行

Postgresql 将主键int类型更改为串行,postgresql,primary-key,auto-increment,Postgresql,Primary Key,Auto Increment,有没有一种方法可以在不删除表的情况下将现有主键类型从int更改为serial?我已经有很多数据在表中,我不想删除它 将int转换为串行,使其成为串行 为序列选择一个大于表中任何现有值的起始值 从mytable中选择MAXid+1 为序列表名创建序列\u columnname\u seq是个好名字 假设要从3开始创建序列测试\u id\u seq MINVALUE 3 更改列的默认值以使用序列 ALTER TABLE test ALTER id SET DEFAULT nextval'test_i

有没有一种方法可以在不删除表的情况下将现有主键类型从int更改为serial?我已经有很多数据在表中,我不想删除它

将int转换为串行,使其成为串行

为序列选择一个大于表中任何现有值的起始值 从mytable中选择MAXid+1

为序列表名创建序列\u columnname\u seq是个好名字 假设要从3开始创建序列测试\u id\u seq MINVALUE 3

更改列的默认值以使用序列 ALTER TABLE test ALTER id SET DEFAULT nextval'test_id_seq'

更改表/列所拥有的序列; 更改序列test\u id\u seq由test.id拥有


和往常一样,在运行来自Internet上随机用户的SQL查询之前,要养成运行完整备份的习惯-

这有什么用?你能解释一下它为什么有效或者其他可能的解决方案吗?嗯:它创建了一个OP没有做的表格,用OP没有做的随机值填充它,添加OP想要的seria loldstyle并使其成为OP想要的主键,但是我们如何在不同的表中使用此递增值作为外键。它在链接到的其他表中提供空值。有人能解释为什么test.id查询拥有的权限所有权ALTER SEQUENCE test_id_seq很重要吗?我有不匹配的架构,因此无法运行此操作。@ConnorWilloughby(用于描述对表列使用串行类型的实际效果的PostgreSQL版本12),“序列标记为“由”列所有,因此如果删除列或表,将删除该序列。”也就是说,现在将级联删除列或表,也要摆脱这个序列。方便
-- 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