语境
我们正在建立一个介绍博客。到数据库课程项目。
在我们的博客中,我们希望能够设置Labels
. 不能单独存在,它们只有在与 a 相关时才会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
)
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
当我从表中删除对它的所有引用时,不会从数据库中删除LabelPosts
。我认为由于 Postgres 给出的原因,尽管 SQLite 在没有警告的情况下接受了该表。PostgreSQL 抱怨这
labelId
不是唯一的LabelPosts
,这是正确的,也是必需的,因为它是多对多的:
pq: S:"ERROR" R:"transformFkeyCheckAttrs" L:"6511" C:"42830" F:"tablecmds.c"
M:"没有唯一约束匹配给定键的引用表\"labelposts\""
所以我明白我做错了约束。但是我不知道如何正确地做到这一点。