Как создать несколько primary key или другим способом разрешить ссылаться другим таблицам на данное поле?
У меня есть база данных
CREATE TABLE themes
(
id SERIAL NOT NULL,
them_name VARCHAR(255) NOT NULL,
PRIMARY KEY(id, them_name)
);
CREATE TABLE rules
(
id SERIAL NOT NULL,
them INTEGER,
rule_body TEXT,
PRIMARY KEY(id),
FOREIGN KEY(them) REFERENCES themes(id)
);
CREATE TABLE dictionary
(
id SERIAL NOT NULL,
word TEXT NOT NULL,
translation TEXT NOT NULL,
PRIMARY KEY(id, word)
);
CREATE TABLE verbs
(
id SERIAL NOT NULL,
first_form VARCHAR(50) NOT NULL,
seckond_form VARCHAR(50),
third_form VARCHAR(50),
PRIMARY KEY(id, first_form)
);
CREATE TABLE users
(
id SERIAL NOT NULL,
chat_id BIGINT NOT NULL,
username VARCHAR(255),
full_name VARCHAR(255),
PRIMARY KEY(id, chat_id)
);
CREATE TABLE students
(
id SERIAL NOT NULL,
user_id INTEGER NOT NULL,
teacher INTEGER,
PRIMARY KEY(id),
FOREIGN KEY(user_id) REFERENCES users(id),
FOREIGN KEY(teacher) REFERENCES teachers(id)
);
CREATE TABLE teachers
(
id SERIAL NOT NULL,
user_id INTEGER NOT NULL,
PRIMARY KEY(id),
FOREIGN KEY(user_id) REFERENCES users(id)
);
CREATE TABLE word_student
(
id SERIAL NOT NULL,
dict_id INTEGER NOT NULL,
student_id INTEGER NOT NULL,
PRIMARY KEY(id),
FOREIGN KEY(dict_id) REFERENCES dictionary(id),
FOREIGN KEY(student_id) REFERENCES students(id)
);
Я пытаюсь создать ее с помощью скрипта, но у меня не получается, выводится ошибка
asyncpg.exceptions.InvalidForeignKeyError: there is no unique constraint matching given keys for referenced table "themes"
Насколько я знаю, в sql есть возможность создавать prymary key для 2 и более полей внутри таблицы, я это сделал `PRIMARY KEY(id, them_name), но при создании базы, выводится ошибка, что на id невозможно сослаться, т.к он не является первичным ключом. В чем ошибка, как мне сделать несколько первичных ключей, или разрешить ссылаться на поля другими способами ?
Ответы (1 шт):
Вам нужно повторить колонки в основной таблице и дочерней, не забывая что группы колонок должны повторятся в обеих таблицах.
FOREIGN KEY(them,them_name) REFERENCES themes(id, them_name)
подробнее тут
The point to be remembered that, type and number of columns in FOREIGN KEY must be matched with the type and number of columns with the referenced columns in referenced table.