如何为已创建的PostgreSQL表创建外键?

时间:2020-08-27 07:41:11

标签: sql postgresql

我有两个表表1:

cs111=# \d structure;
              Table "public.structure"
  Column  |  Type   | Collation | Nullable | Default 
----------+---------+-----------+----------+---------
 page_url | text    |           |          | 
 arm_id   | integer |           |          | 
Indexes:
    "structure_arm_id_key" UNIQUE CONSTRAINT, btree (arm_id)

和表2:

cs111=# \d bandit_pages;
              Table "public.bandit_pages"
   Column    |  Type   | Collation | Nullable | Default 
-------------+---------+-----------+----------+---------
 campaign_id | text    |           |          | 
 arm_id      | integer |           |          | 
 status      | boolean |           |          | 

我想使arm_id表中的structure成为bandit_pages表的外键,但要位于campaign_id的列上。这些表已经制作好了,所以我不确定如何更改这些表。请帮忙。

1 个答案:

答案 0 :(得分:1)

整个问题似乎都朝着错误的方向发展,但是无论如何。

根据以下假设:

  1. campaign_id实际上是一个错误地存储为字符串的数字
  2. campaign_id确实存储了structure.arm_id的值

然后,您可以使用以下步骤创建外键:

-- convert campaign_id to a proper integer
alter table bandit_pages
  alter campaign_id type integer using campaign_id::int;

-- make campaign_id unique 
alter table bandit_pages
  add constraint unique_campaign_id unique (campaign_id);
  
--- create the foreign key
alter table structure
   add constraint fk_structure_bandit_pages 
   foreign key (arm_id) references bandit_pages (campaign_id);