#sql #postgresql #foreign-keys #create-table
#sql #postgresql #внешние ключи #create-table
Вопрос:
CREATE TABLE TEST( course_number INTEGER NOT NULL,
semester INTEGER NOT NULL,
time INTEGER NOT NULL,
room INTEGER NOT NULL,
day INTEGER NOT NULL,
credit_points INTEGER NOT NULL,
UNIQUE(course_number,semester),
CHECK(course_number>0),
CHECK(credit_points>0),
CHECK(room>0));
CREATE TABLE STUDENT (student_id INTEGER NOT NULL,
student_name text NOT NULL,
faculity text NOT NULL,
credit_points INTEGER NOT NULL,
UNIQUE(student_id),
CHECK(student_id>0),
CHECK(credit_points>=0));
CREATE TABLE STUDENT_REG
(student_id INTEGER NOT NULL,
course_number INTEGER NOT NULL,
semester INTEGER NOT NULL,
FOREIGN KEY (student_id) REFERENCES STUDENT(student_id),
FOREIGN KEY (course_number) REFERENCES TEST(course_number),
FOREIGN KEY (semester) REFERENCES TEST(semester));
У меня есть три таблицы:
- Тест
- Студенты
- Регистрация студента, это цель для студента на курс.
Я получаю эту ошибку при компиляции третьей таблицы:
ERROR: there is no unique constraint matching given keys for referenced table "test"
Я понятия не имею, почему, любая помощь будет высоко оценена.
Ответ №1:
Вам нужен составной внешний ключ, а не два разных ключа:
CREATE TABLE STUDENT_REG (
student_id INTEGER NOT NULL,
course_number INTEGER NOT NULL,
semester INTEGER NOT NULL,
FOREIGN KEY (student_id) REFERENCES STUDENT(student_id),
FOREIGN KEY (course_number semester) REFERENCES TEST(course_number, semester)
);
Зачем вам это нужно, потому что таблица TEST
as имеет составной уникальный ключ для этих двух столбцов:
UNIQUE(course_number,semester)
Таким образом, чтобы таблица STUDENT_REG
однозначно ссылалась на строку TEST
, вам нужна комбинация обоих столбцов, что означает внешний ключ из 2 столбцов, а не два разных внешних ключа.