在sqlite中可以交叉引用外键

时间:2015-12-23 13:16:57

标签: sqlite

我将从c ++ opp设计模式中道歉

对于示例三个表数据库(省略了非键字段),是否可以在REFERENCES部分中交叉引用另一个表?

CREATE TABLE `Attempt` (
    `attempt_ID`    INTEGER PRIMARY KEY AUTOINCREMENT,
    `username`  TEXT NOT NULL,
    `assessment_ID` INTEGER NOT NULL,
    `timestamp` INTEGER NOT NULL,
    FOREIGN KEY(`username`) REFERENCES Students ( username ),
    FOREIGN KEY(`assessment_ID`) REFERENCES Assessments ( assessment_ID )
);
CREATE TABLE `Questions` (
    `assessment_ID` INTEGER NOT NULL,
    `question_number`   INTEGER NOT NULL,
    PRIMARY KEY(assessment_ID,question_number)
);
CREATE TABLE "Responses" (
    `attempt_ID`    INTEGER,
    `question_number`   INTEGER,
    PRIMARY KEY(attempt_ID,question_number),
    FOREIGN KEY(`attempt_ID`) REFERENCES Attempt ( attempt_ID )
);

显而易见的解决方案是在每个问题中包含assessment_ID 但是如果我们已经知道了attempt_ID,那么我们可以查找评估ID吗?

CREATE TABLE "Responses" (
    `attempt_ID`    INTEGER,
    `assessment_ID` INTEGER,
    `question_number`   INTEGER,
    PRIMARY KEY(attempt_ID,question_number),
    FOREIGN KEY(`attempt_ID`) REFERENCES Attempt ( attempt_ID )
    FOREIGN KEY(`assessment_ID`,`question_number`) REFERENCES `Questions` ( `assessment_ID`,`question_number` )
);

Sub_Reference可能吗?

1 个答案:

答案 0 :(得分:0)

你似乎想做的不是“理智”。

这似乎是你想在Response表中做的。

FOREIGN KEY(question_number) 
    REFERENCES Questions(assessment_ID, question_number)

那不是“理智”。 (那不是SQL。)一列(question_number)不能引用两列(assessment_ID,question_number)。

很难说你需要做些什么来解决这个问题。尝试和响应之间的区别尚不清楚。如果响应是对问题的回答,那么您的Responses表应该看起来像这样。

CREATE TABLE responses (
attempt_ID integer not null,
assessment_ID integer not null,
question_number integer not null,
primary key (attempt_ID, assessment_ID, question_number),
foreign key (attempt_ID) references Attempt (attempt_ID ),
foreign key (assessment_ID, question_number) 
    references questions (assessment_ID, question_number)
);
  

显而易见的解决方案是在每个中包含assessment_ID   question.row但是如果我们已经知道了attempt_ID那么我们就可以查找了   评估ID?

您是否能找到某种方式导航到您想要的信息并不是真正相关的。实际上,这种事情是数据关系模型开发解决的问题。如今,我们基于功能依赖和规范化设计数据库。

另外,如果您在SQLite中设计新数据库,则可能不应该使用MySQL语法编写代码。