mysql 迁移到 postgres 后重新启动主键序列,最重要的是保留旧数据以实现参照完整性
after mysql migration to postgres restarting primary key sequences and most importantly retaining older data for referential integrity aspect
- 我将我的 mysql 数据库迁移到 postgres,现在看起来很像 Sql
服务器和 mysql 我们可以在其中更改数据类型并应用
autoincremet 新的 recorset 将获得增量值
自动.
- 但在 postgres 中不会发生自动递增,存在一些繁琐的解决方法,但旧值的递增是
仍然是一个曲线球
- 有没有什么线性的方式来保留和
自动应用增量主键值 ?
评论有点长
如果您是 "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;
- 我将我的 mysql 数据库迁移到 postgres,现在看起来很像 Sql 服务器和 mysql 我们可以在其中更改数据类型并应用 autoincremet 新的 recorset 将获得增量值 自动.
- 但在 postgres 中不会发生自动递增,存在一些繁琐的解决方法,但旧值的递增是 仍然是一个曲线球
- 有没有什么线性的方式来保留和 自动应用增量主键值 ?
评论有点长
如果您是 "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;