mysql 迁移到 postgres 后重新启动主键序列,最重要的是保留旧数据以实现参照完整性

after mysql migration to postgres restarting primary key sequences and most importantly retaining older data for referential integrity aspect

  1. 我将我的 mysql 数据库迁移到 postgres,现在看起来很像 Sql 服务器和 mysql 我们可以在其中更改数据类型并应用 autoincremet 新的 recorset 将获得增量值 自动.
  2. 但在 postgres 中不会发生自动递增,存在一些繁琐的解决方法,但旧值的递增是 仍然是一个曲线球
  3. 有没有什么线性的方式来保留和 自动应用增量主键值 ?

评论有点长

如果您是 "migrating" 从 MySQL 到 Postgres 的数据库,那么您应该将 auto_increment 列转换为 serial 列。

数据搬过来后,可能需要重新启动串口值

我不知道您使用什么过程来移动数据,但可以安全地进行。

  • 很遗憾,目前好像没有直接的方法可以实现 有效的迁移方案 .

但是,我通过以下 sql 脚本实现了预期的结果。

 --create new column to create sequences
    alter table modnames add id serial; 
    ---update new column serial column with existing value
    UPDATE modnames m
    SET    id = m0.modnameid
    FROM   modnames m0
    where m.modnameid=m0.modnameid
    ---now tricky part is to tell new serial to start from max(existingid) for referential integrity
    --scenarios
    ---to figure out your serial sequence 
    SELECT adsrc FROM pg_attrdef WHERE adrelid = (SELECT oid FROM pg_class WHERE relname = 'table name goes here');
    --and apply new set of serial sequences
    Select setval('modnames_id_seq', (select max(modnameid)+1 from modname), false)
    --test you applications
    INSERT INTO public.modnames
    (mname, modnameid, createdat, updatedat, recordstate)
    VALUES('new entry set ', 0, now(), now(), 'active'::character varying);
    --to find serial sequences
    --delete old column and rename the older to new one 
    ALTER TABLE modnames RENAME COLUMN id TO modnameid;