Ограничение FK требует ограничения UNIQUE или PK для целевого столбца (столбцов), который schoolname
явно не может обеспечить. Вам понадобится другой стол с уникальными рядами в школе:
CREATE TABLE school(
school_id serial PRIMARY KEY,
schoolname text NOT NULL
);
CREATE TABLE student(
student_id serial PRIMARY KEY,
studentname text
);
CREATE TABLE schoolstudent(
school_id int REFERENCES school,
student_id int REFERENCES student,
PRIMARY KEY (school_id, student_id)
);
CREATE TABLE course(
course_id text PRIMARY KEY,
school_id int REFERENCES school
);
Использование короткого синтаксиса для ограничений внешнего ключа. Details in the manual.
Если вам действительно нужно schoolname
в schoolstudent
столе (я серьезно сомневаюсь, что выглядит как дизайн ошибки), вы можете просто добавить его. Чтобы обеспечить ссылочную целостность, вы можете включить в внешний ключ, но вам необходимо (избыточное) соответствие UNIQUE
ограничений на school(school_id, schoolname)
.
CREATE TABLE schoolstudent(
school_id int,
student_id int REFERENCES student,
schoolname text,
PRIMARY KEY (school_id, student_id),
CONSTRAINT schoolstudent_combo_fk FOREIGN KEY (school_id, schoolname)
REFERENCES school (school_id, schoolname) ON UPDATE CASCADE
);
Использование явного синтаксиса в этом случае. И я предлагаю каскадировать обновления.
Или если schoolname
фактически гарантированно UNIQUE
(опять же, мои сомнения), вы можете полностью заменить school_id
и просто использовать schoolname
, как PK и FK колонки. Длинные столбцы text
не очень эффективны для этой цели, хотя - если производительность имеет значение. И меняются школьные имена, что не идеально подходит для столбцов PK.
Вы все равно нуждаетесь в отдельной таблице school
в любом случае.
Это их способ, которым я могу использовать имя школы, не создавая новую таблицу, или это невозможно? потому что мне нужно имя школы в таблице «schoolstudent» –
@ R.Y.H: Рассмотрим добавление. –
'есть способ, которым я могу использовать имя школы с вами ...' Это зависит от того, полностью ли зависит имя школы, от course_id (мы не знаем, вы знаете, что знаете). Если один и тот же курс может быть проведен в * более чем одной школе, * по крайней мере * потребуется одна дополнительная таблица.(и студенческий курс должен будет обратиться к ученику + {курсу, школе} – joop