0

У меня есть две таблицы в PostgreSQL:Создание внешнего ключа из двух разных таблиц

create Table student (
studentID integer primary key, 
studentname text 
); 

create Table courses (
courseID text primary key, 
schoolname text 
); 

Я хочу, чтобы создать третью таблицу schoolstudent, которая имеет внешний ключ (studentID, schoolname) где studentID ссылается на первичный ключ student таблицы и schoolname ссылки schoolname ключ в таблице courses.

Как создать внешний ключ из двух разных таблиц в PostgreSQL 9.4 или 9.5?

ответ

1

Ограничение 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 в любом случае.

+0

Это их способ, которым я могу использовать имя школы, не создавая новую таблицу, или это невозможно? потому что мне нужно имя школы в таблице «schoolstudent» –

+0

@ R.Y.H: Рассмотрим добавление. –

+0

'есть способ, которым я могу использовать имя школы с вами ...' Это зависит от того, полностью ли зависит имя школы, от course_id (мы не знаем, вы знаете, что знаете). Если один и тот же курс может быть проведен в * более чем одной школе, * по крайней мере * потребуется одна дополнительная таблица.(и студенческий курс должен будет обратиться к ученику + {курсу, школе} – joop

0

вы можете установить многие ко многим отношения, только если оба поля являются Unique (вероятно, первичные ключи) .Если выше условие выполняется вы можете использовать

CREATE TABLE Schoolstudent(
    ID INT references  student(studentID), 
    Schoolname CHAR(50) references courses(Schoolname), 

); 

Но schoolname в таблице courses должен быть уникальным или PK.

+0

Есть ли способ, которым я могу объединить студенческий идентификатор с именем школы как внешний ключ, чтобы он стал уникальным. Поскольку studentID уникален, так что внешний ключ (studentID, schoolname) станет уникальным? Например, если у нас есть атрибут courseame, мы можем создать курсы иностранных ключей (courseID, courseame) (courseID, courseame). Можем ли мы сделать то же самое, если два атрибута находятся в разных таблицах? –

Смежные вопросы