Как я могу избежать «ОШИБКИ: нет уникального ограничения, соответствующего заданным ключам для ссылочной таблицы» при ссылке на первичный ключ комбинации в Postgres?

У меня есть следующее определение таблицы в схеме 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**)

«дочерняя таблица имеет ограничение внешнего ключа с подмножеством комбинации первичного ключа» -> Где вы прочитали, что это можно сделать? На странице справки Postgres по внешним ключам указано: Внешний ключ должен ссылаться на столбцы, которые либо являются первичным ключом, либо образуют ограничение уникальности, либо являются столбцами из нечастичного уникального индекса. Как вы сами заметили, это набор из 4 столбцов, объявленный уникальным. Подмножество (Product, Version, Grade) нет.

Atmo 27.06.2024 23:30

Ваш внешний ключ указывает на коллекцию столбцов, уникальность которой не гарантируется. Я бы изменил модель данных и использовал числовой идентификатор для первичного ключа и ограничение уникальности для столбцов, которые должны быть уникальными. Имхо вам следует изменить обе таблицы. The key, the whole key, and nothing but the key, sohelp me Codd

Frank Heikens 27.06.2024 23:34
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Спасибо @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)

Другие вопросы по теме