最小的定义:
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_id
和id1, 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
串行/序列的行为方式,即作品也。
您可以定义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)