Внешние ключевые противоречия в отношениях многих ко многим

контекст

Мы'перестраивать блог для вступления. к базам данных курсового проекта.

В нашем блоге мы хотим установить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 \ ""

Итак, я понимаю, что яЯ делаю мое ограничение неправильно. Однако я нене знаю, как сделать это правильно.

Ответы на вопрос(2)

Ваш ответ на вопрос