在postgres中将主键和外键更改为整数
Posted
技术标签:
【中文标题】在postgres中将主键和外键更改为整数【英文标题】:Change primary and foreign keys to integer in postgres 【发布时间】:2020-12-22 09:47:45 【问题描述】:我有一些表格,其中包含类似的数据
公司(compid、名称、地址) 国家(countryid,名称)每家公司都在一个国家经营,并且有一张桌子
being(compid,countryid) 带有外部键
compid 和 countryid 是 varchar,例如 company001、country112
1)我想将它们更改为整数键。假设我们在表中有数据,如何做到这一点?
-
第一个可能更容易一些。挑战在于外键。尤其是在“being”表中,如何自动从现有的旧 varchar 映射到分配的整数键(或批量更改)?
有什么方法可以修改现有数据并进行转换,例如国家键 coutry112 到 112 用 SQL 命令?即使在新专栏中?
【问题讨论】:
【参考方案1】:我认为级联外键约束不会改变列的类型。
因此,删除所有外键约束,更改类型,然后重新创建外键。
删除所有外键约束。
alter table <table name> drop constraint <constraint name>;
更改父表中的类型:
alter table countries alter column countryid
set data type int using ((regexp_match(countryid, '[0-9]+$'))[1]::int);
alter table companies alter column companyid
set data type int using ((regexp_match(companyid, '[0-9]+$'))[1]::int);
使用与上述相同的结构更改子表中的类型。
重新创建外键约束。
【讨论】:
我可能没有正确提出这个问题。我可以在主表中添加一个新的整数键。问题是如何用新的整数键(例如自动增量)更新他们使用旧外键的表。有没有什么命令可以让我快速用新的外键更新旧的外键?喜欢更新并设置新的外键 @Anti76 。 . .如果您有不同的列,您应该提出一个新问题。这个问题的标题似乎很明显是关于改变现有的价值观。我的意思是,您可以使用regexp_match()
表达式从当前值中提取数字——如果这是正在使用的整数。以上是关于在postgres中将主键和外键更改为整数的主要内容,如果未能解决你的问题,请参考以下文章