PostgreSQL的:复合型和独立柱之间的外键

问题描述 投票:0回答:1

最小的定义:

CREATE TYPE GlobalId AS (
  id1 BigInt,
  id2 SmallInt
);

CREATE TABLE table1 (
  id1 BigSerial NOT NULL,
  id2 SmallInt NOT NULL,
  PRIMARY KEY (id1, id2)
);

CREATE TABLE table2 (
  global_id GlobalId NOT NULL,
  FOREIGN KEY (global_id) REFERENCES table1 (id1, id2)
);

总之,我使用的table2(和许多其他台)的复合类型,但对于主表(table1),我不直接使用该复合型,因为复合类型不支持使用Serial的。

上述产生以下错误由于global_idid1, id2之间的表面上的不匹配:number of referencing and referenced columns for foreign key disagree

或者,如果我定义了外键FOREIGN KEY (global_id.id1, global_id.id2) REFERENCES table1 (id1, id2),我获得使用上global_id的访问语法错误。

如何定义这个外键关系的任何想法?或者,如果有一个为table1使用GlobalId复合型同时还获得了id1串行/序列的行为方式,即作品也。

postgresql foreign-keys composite-key compositetype
1个回答
0
投票

您可以定义table1使用复合型,并使用BEFORE触发补值:

CREATE TABLE table1 (id globalid PRIMARY KEY);

CREATE SEQUENCE s OWNED BY table1.id;

CREATE FUNCTION ins_trig() RETURNS trigger LANGUAGE plpgsql AS
$$BEGIN
   NEW.id = (nextval('s'), (NEW.id).id2);
   RETURN NEW;
END;$$;

CREATE TRIGGER ins_trig BEFORE INSERT ON table1 FOR EACH ROW
   EXECUTE PROCEDURE ins_trig();

INSERT INTO table1 VALUES (ROW(NULL, 42));

SELECT * FROM table1;
   id   
--------
 (1,42)
(1 row)
© www.soinside.com 2019 - 2024. All rights reserved.