Прототип базы данных Postgresql: ОШИБКА: не существует уникального ограничения, соответствующего заданным ключам для таблицы "сообщения", на которую ссылаются - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь настроить прототип базы данных, и у меня возникают проблемы с одной из моих слабых сущностей, attachments, которая продолжает выдавать следующую ошибку при создании:

ОШИБКА: есть нет уникального ограничения, соответствующего данным ключам для ссылочной таблицы "messages"

Ниже показано SQL операторов создания таблицы (которые являются частью большого файла схемы с большим количеством включенных).

CREATE TABLE IF NOT EXISTS Patients(
CPR_number integer NOT NULL,
first_name varchar(20),
last_name varchar(20),
zip_code integer,
address varchar(100),
country varchar(20),
history text,
PRIMARY KEY (CPR_number)
);

CREATE TABLE IF NOT EXISTS Messages(
CPR_number integer,
topic text,
body text,
date_send varchar(8),
date_read varchar(8),
PRIMARY KEY (body, date_send),
FOREIGN KEY (CPR_number) REFERENCES Patients(CPR_number)
);

CREATE TABLE IF NOT EXISTS Attachments(
CPR_number integer,
file text,
body text,
date_send varchar(8),
PRIMARY KEY (file),
FOREIGN KEY (body) REFERENCES Messages(body),
FOREIGN KEY (date_send) REFERENCES Messages(date_send),
FOREIGN KEY (CPR_number) REFERENCES Patients(CPR_number)
);

Кто-нибудь может мне помочь, почему я продолжаю получать ошибку, показанную выше? Первоначально я пытался установить атрибуты date как TIMESTAMP, но было понятно, почему это может быть довольно сложно разделить на наборы слабых объектов, поэтому я изменил его на varchar(8) (для представления MM-DD-YYYY ). Но я не понимаю, почему вышеупомянутое не компилируется правильно.

У меня есть несколько других слабых наборов сущностей, которые имеют ту же структуру, но где создание завершается успешно каждый раз без каких-либо ошибок. И я не могу просто понять, почему вышеупомянутое не должно работать также. messages имеет ключи: body, date_send и CPR_number но как-то они не совпадают?

Может кто-нибудь увидеть, что может быть не так?

1 Ответ

1 голос
/ 04 мая 2020

Ваши внешние ключи должны быть первичными ключами. Ваша модель данных на самом деле не имеет смысла. Я бы ожидал что-то вроде этого:

CREATE TABLE IF NOT EXISTS Patients (
    patient_id int generated always as identity primary key,
    . . .
);

CREATE TABLE IF NOT EXISTS Messages (
    message_id int generated always as identity primary key,
    patient_id int,
    . . .
    topic text,
    body text,
    date_send date,
    date_read date,
    foreign key (patient_id) REFERENCES Patients( patient_id)
);

CREATE TABLE IF NOT EXISTS Attachments (
    attachment_id int generated always as identity primary key,
    message_id int,
    file text,
    foreign key (message_id) references messages(message_id)
);

Примечание: я понятия не имею, что такое cpr_number. Возможно, это атрибут, который должен быть в одной из таблиц (возможно, уникальный идентификатор для пациентов?). В любом случае используйте синтаксические c первичные ключи и ссылайтесь на них.

Помните о других вещах:

  • Даты должны храниться как даты, а не как строки.
  • Внешние ключи должны ссылаться на первичные ключи.
  • Не повторять поля данных в нескольких таблицах. Значения должны храниться только один раз.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...