PostgreSQL多字段外键使用方法求助
PostgreSQL多字段外键使用方法求助
嘿,别着急,这事儿其实没那么复杂!你的products表用的是复合主键(由type_p, model_p, company, weight_p, size_p这五个字段共同组成),所以要在另一个表里设置外键关联的话,必须把这五个字段都包含进去,并且严格匹配它们的顺序和数据类型。
我给你举个具体的例子,假设你要创建一个叫order_items的表来关联products,代码可以这么写:
CREATE TABLE IF NOT EXISTS public.order_items ( order_id integer NOT NULL, -- 必须包含products表主键的所有字段,类型要和主表完全一致 type_p text NOT NULL, model_p text NOT NULL, company text NOT NULL, weight_p text NOT NULL, size_p text NOT NULL, quantity integer NOT NULL, -- 自定义的主键(也可以用复合主键) CONSTRAINT order_items_pkey PRIMARY KEY (order_id, type_p, model_p, company, weight_p, size_p), -- 设置多字段外键约束,字段顺序要和products表的主键顺序完全对应 CONSTRAINT fk_order_items_products FOREIGN KEY (type_p, model_p, company, weight_p, size_p) REFERENCES public.products (type_p, model_p, company, weight_p, size_p) ON DELETE CASCADE -- 可选:设置删除主表记录时的行为,比如级联删除子表记录 ON UPDATE CASCADE -- 可选:设置更新主表主键时的行为,比如级联更新子表字段 );
这里有几个关键要点得注意:
- 子表必须包含主表复合主键的所有字段,而且每个字段的数据类型要和主表完全一致(比如主表的
weight_p是text,子表也得是text) - 外键约束里的字段顺序必须和主表主键的顺序完全匹配,不能乱序,不然PostgreSQL会认为不匹配
- 你可以根据需求添加
ON DELETE和ON UPDATE的规则,比如CASCADE表示主表的记录被删除/更新时,子表对应的记录也会跟着删除/更新,当然也可以用RESTRICT(默认,阻止删除/更新)或者SET NULL(如果字段允许为空的话)
要是你还有其他疑问,随时问我哈!
备注:内容来源于stack exchange,提问作者omid azimzadeh




