在sqlite中,是否可以交叉引用外键 我将从C++ OPP设计模式开始道歉。

在sqlite中,是否可以交叉引用外键 我将从C++ OPP设计模式开始道歉。,sqlite,Sqlite,对于示例三表数据库(省略非键字段),是否可以在引用部分交叉引用另一个表 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`) REF

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

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 )
);
显而易见的解决方案是在每个问题中都包含评估ID。行 但是如果我们已经知道了尝试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` )
);

也许是次参考

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

这就是您似乎希望在响应表中执行的操作

FOREIGN KEY(question_number) 
    REFERENCES Questions(assessment_ID, question_number)
那不是“理智的”。(这不是SQL。)一列(问题编号)不能引用两列(评估编号、问题编号)

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

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)
);
显而易见的解决方案是将评估ID包含在每个 但如果我们已经知道了尝试ID,那么我们可以查找 评估ID

你是否能找到某种方式来导航到你想要的信息并不重要。事实上,这类问题正是数据关系模型所要解决的问题。现在,我们基于函数依赖和规范化设计数据库


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

进一步研究SQLite外键约束后发现,外键约束在数据库中不起作用。以防有人带着类似的想法来到这里。