Nasty sql error (POSTGRES) "Не существует уникального ограничения, соответствующего данным ключам для ссылочной таблицы ..." - PullRequest
0 голосов
/ 06 января 2020

РЕДАКТИРОВАТЬ: таблицы были переведены с моего языка на английский sh Я изменил ссылку на внешний ключ в таблице Комментарий к "Utente" -> "Пользователь"

Привет всем, я пытаюсь построить небольшую систему обзора в sql следующим образом. Каждый пользователь может комментировать какой-либо элемент (может быть что угодно), а любой другой пользователь может ответить на любой комментарий. Администратор сайта не может публиковать комментарии самостоятельно, он может отвечать только на комментарии пользователя ... Вот код, который объясняется шаг за шагом.

Таблицы для определения сущностей "Пользователь" и "Комментарий"

create table User(
  Username varchar(15),
  Email varchar (25),
  Nome varchar (25),
  Foto varchar (35),
  primary key (Username, Email) 
);

create table Comment (
  Username varchar(15),
  Email varchar(25),
  DateComment timestamp not null,
  Text varchar(250),    
  primary key(DateComment, Text, Email, Username),
  foreign key(Username, Email) references User(Username, Email)
        On update cascade
        On delete set null
);

Каждый пользователь может публиковать комментарии к определенным c элементам, и любой пользователь также может отвечать на комментарии. только ответы на комментарии других, поэтому я создал эти таблицы

create table Admin(
    AdminName varchar(20) primary key

);

create table AdminAnswers
(
    DataComment timestamp not null,
    Text varchar(500),
    DateAndTime timestamp not null,
    AdminName varchar(20) unique,
    primary key(DataComment, Text, DateAndTime, AdminName),
    foreign key (DateComment, Text) references Comment(DateComment, Text)
        On update cascade
        On delete no action,
    foreign key(DateAndTime) references Answer(DateAndTime)
        On update cascade
        On delete no action,
        foreign key (AdminName) references Admin(AdminName) 
        On update no action
        On delete no action

);

Postgres говорит: «Не существует уникальных ключей соответствия ограничений для ссылочной таблицы« Комментарий »» ... Я смотрю на некоторые ответы и я пытался добавить «уникальные» в атрибуты моей таблицы «Пользователь», но я не могу это преодолеть. Файл ddl довольно большой, поэтому при необходимости я выложу больше кода. Спасибо за ответ!

Ps. я знаю, что было бы проще иметь некоторые атрибуты, такие как "CommentId" или "UserId", но, к сожалению, проект требует, чтобы его имплантировали таким образом.

1 Ответ

0 голосов
/ 06 января 2020

Опечатки, исключающие добавление уникального ограничения в таблицу комментариев перед созданием таблицы ответов, предотвратят эту ошибку. Вы можете сделать это как отдельный оператор, такой как ниже:

alter table comment add constraint unique_for_fk unique(DateComment, Text);

Или вы можете обновить скрипт таблицы, чтобы включить его во время создания таблицы:

create table Comment (
  Username varchar(15),
  Email varchar(25),
  DateComment timestamp not null,
  Text varchar(250),    
  primary key(DateComment, Text, Email, Username),
  foreign key(Username, Email) references "User"(Username, Email)
        On update cascade
        On delete set null,
  CONSTRAINT unique_for_fk UNIQUE( DateComment, Text)
);
...