postgresql 如何将现有数据的表主键从字符改为串行

ifsvaxew  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(130)

我正在和一个同事一起工作,她对Postgres和数据库都是新手。她创建了一个表,表中的列ID是字符变化类型的,并将其作为主键。所以很明显,当运行Python脚本来填充表时,她自己递增了ID,并将其作为字符串插入。她将相当大量的数据插入表中,所以我想修复它,而不是让她重新开始。我需要改变ID列类型串行(她应该使它开始),但我不认为我可以只改变类型,因为它包含字符数据。有人能告诉我最好的方法来解决这个问题吗?

dced5bon

dced5bon1#

serial不是一个真实的类型。它是一个具有关联序列的整型列。在修改现有列时,您必须自己完成这项工作。
我假设这些值是整数,它们只是存储为文本。

-- Alter the ID column to integer, and cast the values to integers
alter table test alter id type integer using id::integer;

-- Make the ID a generated identity. This is similar to serial.
-- It also creates a sequence.
alter table test alter id add generated by default as identity;

-- Sequences start at 1. This would likely cause a duplicate the next time
-- you inserted a row.
-- Find the sequence attached to the ID column, and change it to start at
-- the next highest ID.
select setval(pg_get_serial_sequence('test', 'id'), coalesce(max(id), 0)+1 , false) from test;

字符串
有关最后一条语句的更多信息,请参见this answer。有关串行与标识的更多信息,请参见this answer
Demonstration的函数。
如果ID值不是整数,那么最好丢弃ID列并创建一个新的ID列,因为这会变得很复杂,所以假设没有外键引用该ID。

-- Drop the old one
alter table test drop id;

-- Add a new primary key.
-- Alternatively, you can `alter table test add id serial primary key`
alter table test add id integer primary key generated by default as identity;


新的ID列将按顺序填充:1、2、3...
Demonstration的函数。

相关问题