我在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"创建外键,并且如果它们不存在则将值插入外键表中会很好。"
答案 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。