【发布时间】:2014-10-15 07:51:34
【问题描述】:
在 PostgreSQL 中,我有一个数据库,我打算对它进行以下表声明:
CREATE TABLE canvas_user (
id INTEGER,
login_id VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(355) UNIQUE NOT NULL,
name_given VARCHAR(30),
name_family VARCHAR(30),
name_full VARCHAR(50),
role canvas_role,
last_login TIMESTAMP,
PRIMARY KEY (id)
);
CREATE TABLE problem (
id SERIAL,
title VARCHAR(50),
author VARCHAR(50),
path TEXT,
compiler VARCHAR(20),
PRIMARY KEY (id)
);
CREATE TABLE assignment (
id INTEGER,
title TEXT NOT NULL,
points_possible INTEGER NOT NULL,
problem_id INTEGER,
PRIMARY KEY (id),
FOREIGN KEY (problem_id) REFERENCES problem(id)
);
CREATE TABLE submission (
num SERIAL,
user_id INTEGER,
assignment_id INTEGER,
timestamp TIMESTAMP,
path TEXT,
lti_info TEXT[],
PRIMARY KEY(num, user_id, assignment_id),
FOREIGN KEY (user_id) REFERENCES canvas_user(id),
FOREIGN KEY (assignment_id) REFERENCES assignment(id)
);
CREATE TABLE correction (
num INTEGER,
user_id INTEGER,
assignment_id INTEGER,
timestamp TIMESTAMP,
path TEXT,
execution_time interval,
PRIMARY KEY(num, user_id, assignment_id),
FOREIGN KEY (num) REFERENCES submission(num),
FOREIGN KEY (user_id) REFERENCES submission(user_id),
FOREIGN KEY (assignment_id) REFERENCES submission(assignment_id)
);
一切正常,除了创建最后一个表时出现以下错误(更正):
错误:没有与给定键匹配的唯一约束 引用表“提交”
我打算使用更正表对每个提交进行唯一的更正,但提交可以有(或没有)更正。
我该如何解决这个错误?是设计问题还是表声明错误?
【问题讨论】:
-
在提交表时给 user_id 和 assignment_id 添加 NOT NULL。((复合)主键的所有元素都必须是 NOT NULLable)
-
@otorillas: 你为什么不在DDL 语句中为你的
num、user_id和assignment_id属性定义一个多列外键约束@987654326@像这样的表:FOREIGN KEY(num, user_id, assignment_id) REFERENCES submission(num, user_id, assignment_id)?编辑:请原谅,@ErwinBrandstetter 似乎已经用更彻底的答案击败了我。 :) -
糟糕,滚动失败,没有看到更正表。不过,仍然需要 NOT NULL。
-
@joop:我倾向于同意,但还有更多。我在答案中添加了一章。
标签: sql postgresql database-design foreign-keys