当前位置: 首页 > 面试题库 >

外键引用PostgreSQL中的其他外键

阙阳
2023-03-14
问题内容

在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.numsinlge-
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)

  • 问题内容: 进行了一次面试,下面是表格和结构 有人问 “选择所有母亲” “选择那些是“约翰·史密斯”和“简”的孩子 我很困惑,因为我假设外键会像往常一样与其他表链接。但是那时我失败了。有人知道实际答案和原因吗? 问题答案: 这种数据结构称为“自引用表” 和