PostgreSQL: внешний ключ между составным типом и независимыми столбцами - PullRequest
0 голосов
/ 08 февраля 2019

Минимальные определения:

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, это также работает.

1 Ответ

0 голосов
/ 08 февраля 2019

Вы можете определить 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...