У меня есть следующее определение таблицы в схеме pgAdmin4, которую я пытаюсь выполнить:
CREATE TABLE IF NOT EXISTS Reporting
(
SEQ integer,
Product character varying(30) NOT NULL,
Version integer NOT NULL,
Grade character varying(30) NOT NULL,
*Other_Detail...*,
CONSTRAINT pk_Reporting
PRIMARY KEY(SEQ, Product, Version, Grade),
CONSTRAINT fk_Reporting_ProductGrade
FOREIGN KEY(Product, Version, Grade)
REFERENCES Product_Grade(Product, Version, Grade)
)
Предполагается, что таблица ссылается на другую таблицу:
CREATE TABLE IF NOT EXISTS Product_Grade
(
Product character varying(30) NOT NULL,
Version integer NOT NULL,
Grade character varying(30) NOT NULL,
*Other_Detail...*,
CONSTRAINT pk_ProductGrade
PRIMARY KEY(Product, Version, Grade, Sampling Point)
)
В ссылочной таблице определен комбинированный первичный ключ, а в дочерней таблице есть ограничение внешнего ключа с определенным подмножеством комбинированного первичного ключа, верно?
Как получается, что Postgres выдает:
ОШИБКА: нет уникального ограничения, соответствующего заданным ключам для таблицы, на которую ссылается.
Я также подробно изложил ограничения внешнего ключа индивидуально, но безрезультатно:
CONSTRAINT fk_Reporting_ProductGrade1
FOREIGN KEY(Product)
REFERENCES Product_Grade(Product),
CONSTRAINT fk_Reporting_ProductGrade2
FOREIGN KEY(Version)
REFERENCES Product_Grade(Version),
CONSTRAINT fk_Reporting_ProductGrade3
FOREIGN KEY(Grade)
REFERENCES Product_Grade(Grade)
Редактировать:
В ограничении PK определения таблицы Product_Grade
у меня было только 3 ключа в качестве комбинации PK, но на самом деле в таблице 4 ключа:
CONSTRAINT pk_ProductGrade
PRIMARY KEY(Product, Version, Grade, **Sampling Point**)
Ваш внешний ключ указывает на коллекцию столбцов, уникальность которой не гарантируется. Я бы изменил модель данных и использовал числовой идентификатор для первичного ключа и ограничение уникальности для столбцов, которые должны быть уникальными. Имхо вам следует изменить обе таблицы. The key, the whole key, and nothing but the key, sohelp me Codd
Спасибо @Atmo и @Frank Heikens за их комментарии, которые помогли мне скорректировать сценарий.
В итоге я добавил уникальное ограничение с тремя нужными полями:
CONSTRAINT unique_product_grade
UNIQUE (product, version, grade)
Затем я смог назначить эту комбинацию как внешний ключ:
CONSTRAINT fk_reporting_productgrade
FOREIGN KEY(product, version, grade)
REFERENCES Product_Grade(product, version, grade)
«дочерняя таблица имеет ограничение внешнего ключа с подмножеством комбинации первичного ключа» -> Где вы прочитали, что это можно сделать? На странице справки Postgres по внешним ключам указано: Внешний ключ должен ссылаться на столбцы, которые либо являются первичным ключом, либо образуют ограничение уникальности, либо являются столбцами из нечастичного уникального индекса. Как вы сами заметили, это набор из 4 столбцов, объявленный уникальным. Подмножество
(Product, Version, Grade)
нет.