Postgres:创建外键关系,获取表中不存在密钥&#39 ;?

时间:2015-03-17 12:12:38

标签: postgresql foreign-keys

我在Postgres 9.1工作,我想为两个目前没有的表创建一个外键关系。

这些是我的表格:

# \d frontend_item;
                                       Table "public.frontend_item"
      Column       |          Type           |                             Modifiers
-------------------+-------------------------+--------------------------------------------------------------------
 id                | integer                 | not null default nextval('frontend_prescription_id_seq'::regclass)
 presentation_code | character varying(15)   | not null
 pct_code          | character varying(3)    | not null
Indexes:
    "frontend_item_pkey" PRIMARY KEY, btree (id)

# \d frontend_pct;

   Column   |           Type           | Modifiers
------------+--------------------------+-----------
 code       | character varying(3)     | not null
Indexes:
    "frontend_pct_pkey" PRIMARY KEY, btree (code)
    "frontend_pct_code_1df55e2c36c298b2_like" btree (code varchar_pattern_ops)

这就是我正在尝试的:

# ALTER TABLE frontend_item ADD CONSTRAINT pct_fk 
  FOREIGN KEY (pct_code) REFERENCES frontend_pct(code) ON DELETE CASCADE;

但是我收到了这个错误:

ERROR:  insert or update on table "frontend_item" violates 
        foreign key constraint "pct_fk"
DETAIL:  Key (pct_code)=(5HQ) is not present in table "frontend_pct"

我想这是有道理的,因为目前frontend_pct表是空的,而frontend_item中有值。

首先,我ALTER TABLE的语法是否正确?

其次,是否有自动方式在frontend_pct中创建所需的值?如果有一些方法可以告诉Postgres"创建外键,并且如果它们不存在则将值插入外键表中会很好。"

1 个答案:

答案 0 :(得分:1)

你的sintax似乎是正确的。

不,没有自动插入所需值的方法。
您只能在添加约束之前手动完成。在你的情况下必须像

INSERT INTO frontend_pct (code)
SELECT code FROM
(
    SELECT DISTINCT pct_code AS code
    FROM frontend_item
    WHERE pct_code NOT IN (SELECT code FROM frontend_pct)
) AS a;

如果您有大量数据,查询可以是eavy。