在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)
);
一切正常,除了在创建最后一个表(更正)时出现以下错误:
错误:没有唯一的约束匹配给定键的引用表“提交”
我对更正表的打算是对每个提交都有唯一的更正,但是一个提交可以(也可以不)具有更正。
我该如何解决这个错误?是设计问题还是表声明错误?
外键约束不关心所引用的列是否在引用另一列本身。但是引用的列 必须 是唯一的。这就是错误消息告诉您的内容(非常清楚)。
您缺少的是外键约束可以基于
多个列
。这应该工作:
FOREIGN KEY (num, user_id, assignment_id) REFERENCES submission
更换:
~~FOREIGN KEY (num) REFERENCES submission(num),
FOREIGN KEY (user_id) REFERENCES submission(user_id),
FOREIGN KEY (assignment_id) REFERENCES submission(assignment_id)~~
语法(REFERENCES submission
)的简短形式是可能的,因为您要引用主键,这是默认键。
另外,您可以简化:制作submission.num
sinlge-
column主键,从中删除冗余列user_id
,并将fk约束减小为just-如@Tim的答案中所述。
assignment_id``correction``(num)
只要您具有multicolumn fk约束,请考虑NOT NULL
每个引用列上的约束(如@joop所述)。另外,引用列中的一个或多个NULL值允许使用默认MATCH SIMPLE
行为来逃避fk约束。这可能是预期的,也可能不是预期的,通常 不是 。
或者,考虑MATCH FULL
多列fk约束,以仅在 所有 引用列均为NULL的情况下才允许这样做。细节:
我有2个表,你会在下面的posgresql代码中看到。第一个表格学生有2列,一列student_name,另一列student_id主键。在我的第二张测试表中,它有4列,subject_id,subject_name,然后是highestStudent_id中分数最高的学生。我试图让highestStudent_id参考我学生表中的student_id。这是我下面的代码,我不确定语法是否正确: 语
我想知道这两个SQL陈述之间是否有任何(可能是微妙的)区别: 和 我注意到,当我在Postico中使用第一个符号创建表时,但稍后查看创建的表的DDL,被删除,最终使用较短的第二个符号。 使用<code>FOREIGN KEY</code>创建表: DDL视图不显示< code >外键: 因此,我想知道(并寻求确认)这两个语句实际上是100%等价的,或者它们对DB的作用是否有细微的差异。 任何指向官
我对Laravel和数据库都是新手。我正在写一个学生评估的网络应用程序。我有一个现有的MySQL数据库,它已经包含了我所需要的一切;但是,我正在使用Laravel的auth user表,并尝试添加一个外键,该外键引用MySQL数据库中的教师表。我一直得到以下错误。。。 在Connection.php第664行: SQLSTATE[HY000]:一般错误:1215不能添加外键约束(SQL:改变表添加
问题内容: 一般来说,我对Web应用程序和数据库内容还是陌生的,所以这可能是一个愚蠢的问题。我想制作一个模型(“ CategoryModel”),其字段指向模型的另一个实例(其父实例)的主ID。 我该怎么做呢?谢谢! 问题答案: 你可以将模型名称作为字符串传递给ForeignKey,这将做正确的事情。 所以: 或者你可以使用字符串“ self”
问题内容: 我有下表,其中的表是空的,我正在尝试填充: 要填充的源数据是我从外部CSV文件填充的临时表: 我想做的是用中的值填充。该字段可以直接复制,但是我不太确定如何获取正确的内容(可以使用tmp_table.langname确定language.id)和(tmp_table.tplname,tmp_table.source,tmp_table.domain一起使用)确定template.id)
问题内容: 进行了一次面试,下面是表格和结构 有人问 “选择所有母亲” “选择那些是“约翰·史密斯”和“简”的孩子 我很困惑,因为我假设外键会像往常一样与其他表链接。但是那时我失败了。有人知道实际答案和原因吗? 问题答案: 这种数据结构称为“自引用表” 和