コンテクスト
イントロ用のブログを作成しています。データベースコースプロジェクトへ。
私たちのブログでは、に設定できるようにしたいと考えてLabels
いますPosts
。はLabels
単独で存在することはできません。存在するのは、に関連している場合のみですPosts
。このように、Labels
誰も使用していないものをPosts
データベースに残してはなりません。
複数が1つLabel
に属することができPost
、複数Post
がを使用できますLabel
。
SQLite3(ローカル/テスト)とPostgreSQL(デプロイメント)の両方を使用しています。
実装
これらの2つのテーブルをリレーションシップテーブルとともに作成するために使用する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
)
LabelPostsPost
( [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
からSQLite3へのすべての参照を削除しても、データベースから削除されません。LabelPosts
SQLiteが警告なしにテーブルを受け入れたにもかかわらず、Postgresによって与えられた理由のためだと思います。PostgreSQLは、
labelId
内で一意ではないと文句を言いますLabelPosts
。これは、多対多であるため、真実であり、必須でもあります。
pq:S: "ERROR" R: "transformFkeyCheckAttrs" L: "6511" C: "42830" F: "tablecmds.c"
M:"参照テーブル\"labelposts\"の特定のキーに一致する一意の制約はありません"
だから私は自分の制約を間違っていることを理解しています。しかし、私はそれを正しく行う方法がわかりません。