POSTGRESQL:varchar类型字段的自动增量

POSTGRESQL:varchar类型字段的自动增量,postgresql,Postgresql,我正在从MongoDB切换到PostgreSQL,我想知道如何实现MongoDB中使用的相同概念,以便通过MongoId唯一地标识每个RAW 迁移后,数据库中已经存在的唯一字段将保存为字符类型。我正在寻找最小的源代码更改 因此,如果postgresql中存在为每个插入表生成自动递增唯一Id的方法。使用序列作为列的默认值: create sequence some_id_sequence start with 100000 owned by some_table.id_column;

我正在从MongoDB切换到PostgreSQL,我想知道如何实现MongoDB中使用的相同概念,以便通过MongoId唯一地标识每个RAW

迁移后,数据库中已经存在的唯一字段将保存为字符类型。我正在寻找最小的源代码更改


因此,如果postgresql中存在为每个插入表生成自动递增唯一Id的方法。

使用序列作为列的默认值:

create sequence some_id_sequence 
  start with 100000
  owned by some_table.id_column;
以开头的
应该大于当前的最大值

然后使用该序列作为列的默认值:

alter table some_table
   alter id_column set default nextval('some_id_sequence')::text;


更好的解决方案是将列更改为整数列。将数字存储在
text
(或
varchar
)列中是一个非常糟糕的主意。

使用序列作为列的默认值:

create sequence some_id_sequence 
  start with 100000
  owned by some_table.id_column;
开头的
应该大于当前的最大值

然后使用该序列作为列的默认值:

alter table some_table
   alter id_column set default nextval('some_id_sequence')::text;

更好的解决方案是将列更改为整数列。将数字存储在
text
(或
varchar
)列中是一个非常糟糕的主意。

在PostgreSQL中最接近的东西是。请注意,ObjectId只有12个字节,而UUID有128位(16个字节)

您可以通过附加(或预加)f.ex来转换现有ID<代码>'00000000'
发送给他们

alter table some_table
    alter id_column
    type uuid
    using (id_column || '00000000')::uuid;
不过,如果您在迁移schema+数据时能够做到这一点,这将是最好的。如果在迁移期间无法执行此操作,则需要更新ID(当ID仍然是
varchar
s时:这样引用的列将传播更改),删除外键,执行
alter type
,然后重新应用外键

您可以使用生成各种UUID(用于列的默认值)

最接近PostgreSQL的是。请注意,ObjectId只有12个字节,而UUID有128位(16个字节)

您可以通过附加(或预加)f.ex来转换现有ID<代码>'00000000'发送给他们

alter table some_table
    alter id_column
    type uuid
    using (id_column || '00000000')::uuid;
不过,如果您在迁移schema+数据时能够做到这一点,这将是最好的。如果在迁移期间无法执行此操作,则需要更新ID(当ID仍然是
varchar
s时:这样引用的列将传播更改),删除外键,执行
alter type
,然后重新应用外键

您可以使用生成各种UUID(用于列的默认值)


我无法转换为varchar,因为该字段是外键,而且数据库中也填充了data@CelinVeronicca:那么您也应该更改其他列。在
varchar
is列中存储数字是一个非常糟糕的主意。它占用了更多的空间,速度比使用正确的数字慢。我不能改成varchar,因为该字段是外键,而且db也被填充了data@CelinVeronicca:那么您也应该更改其他列。在
varchar
is列中存储数字是一个非常糟糕的主意。它占用了更多的空间,比使用合适的数字要慢。你是说MongoDB中的类型?(有些API使用MongoId这个名称,但请明确)。如果是这样的话,迁移后它们是十六进制格式吗?是的,是十六进制格式。最接近PostgreSQL的是。请注意,MongoDB的
ObjectId
只有12个字节,而UUID有128位(16个字节)。但是您可以通过附加(或预加)f.ex来转换现有ID<代码>'00000000'发送给他们。您可以使用@pozs生成各种UUID(用于列的默认值),请将其作为答案发布;到目前为止,最好的方法是为此使用uuid,并将现有列从varchar转换为uuid?(有些API使用MongoId这个名称,但请明确)。如果是这样的话,迁移后它们是十六进制格式吗?是的,是十六进制格式。最接近PostgreSQL的是。请注意,MongoDB的
ObjectId
只有12个字节,而UUID有128位(16个字节)。但是您可以通过附加(或预加)f.ex来转换现有ID<代码>'00000000'发送给他们。您可以使用@pozs生成各种UUID(用于列的默认值),请将其作为答案发布;到目前为止,最好的方法是为此使用uuid,并将现有列从varchar转换为uuid。