You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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_ptext,子表也得是text
  • 外键约束里的字段顺序必须和主表主键的顺序完全匹配,不能乱序,不然PostgreSQL会认为不匹配
  • 你可以根据需求添加ON DELETEON UPDATE的规则,比如CASCADE表示主表的记录被删除/更新时,子表对应的记录也会跟着删除/更新,当然也可以用RESTRICT(默认,阻止删除/更新)或者SET NULL(如果字段允许为空的话)

要是你还有其他疑问,随时问我哈!

备注:内容来源于stack exchange,提问作者omid azimzadeh

火山引擎 最新活动