Внешние ключевые противоречия в отношениях многих ко многим
Мы'перестраивать блог для вступления. к базам данных курсового проекта.
В нашем блоге мы хотим установитьLabels
наPosts
,Labels
Можно'не существуют сами по себе, они делают это, только если они связаны сPosts
, Сюда,Labels
которые не используются никакимиPosts
не должен»остаться в базе данных.
Больше одногоLabel
может принадлежать одномуPost
и более одногоPost
можно использоватьLabel
Мы используем как SQLite3 (локально / тестирование), так и PostgreSQL (развертывание).
РеализацияВот SQL (разновидность SQLite3), который мы используем для создания этих двух таблиц вместе с таблицей отношений:
СообщенийCREATE TABLE IF NOT EXISTS Posts(
id INTEGER PRIMARY KEY AUTOINCREMENT,
authorId INTEGER,
title VARCHAR(255),
content TEXT,
imageURL VARCHAR(255),
date DATETIME,
FOREIGN KEY (authorId) REFERENCES Authors(id) ON DELETE SET NULL
)
ЭтикеткиCREATE TABLE IF NOT EXISTS Labels(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(255) UNIQUE,
-- This is not working:
FOREIGN KEY (id) REFERENCES LabelPosts(labelId) ON DELETE CASCADE
)
LabelPosts (связь междуPost
[1 .. *] - *)Label
CREATE TABLE IF NOT EXISTS LabelPosts(
postId INTEGER,
labelId INTEGER,
PRIMARY KEY (postId, labelId),
FOREIGN KEY (postId) REFERENCES Posts(id) ON DELETE CASCADE
)
проблемаИспользуя SQLite3,Labels
не удаляются из базы данных, когда я удаляю все ссылки на нее изLabelPosts
Таблица. Я думаю по причине, указанной Postgres, несмотря на то, что SQLite принимает таблицу без предупреждения.
PostgreSQL жалуется, чтоlabelId
не уникален вLabelPosts
, что верно и также требуется, так какмногие ко многим:
pq: S: "ОШИБКА" Р:"transformFkeyCheckAttrs» L:»6511" C:»42830" F:»tablecmds.c»
М:»нет уникального ограничения, соответствующего данным ключам для ссылочной таблицы \ "labelposts \ ""
Итак, я понимаю, что яЯ делаю мое ограничение неправильно. Однако я нене знаю, как сделать это правильно.