在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中将主键和外键更改为整数的主要内容,如果未能解决你的问题,请参考以下文章

SQL的主键和外键的作用

在MySQL中如何设置主键和外键

做java项目时的主键和外键是啥啊?

什么是主键和外键?

数据库中主键和外键是干嘛用的?

数据库中主键和外键是干嘛用的?