我创建了一个具有三个表的dabasehelper类,我希望学生表的主键成为examResult表中的外键。但是当我在examResult表中输入数据时,它将外键列显示为空
public void onCreate(SQLiteDatabase db) {
String query2 = "CREATE TABLE IF NOT EXISTS \"student_and_parent_table1\" ( `ID` integer PRIMARY KEY AUTOINCREMENT, `Name` TEXT, `FatherName` TEXT, `MotherName` TEXT, `ParentEmail` TEXT, `FatherPhoneNumber` INTEGER, `MotherPhoneNumber` INTEGER, `Address` TEXT, `Username` TEXT, `Password` TEXT)";
db.execSQL(query2);
String query3 = "CREATE TABLE IF NOT EXISTS \"teacher_table1\" ( `ID` integer PRIMARY KEY AUTOINCREMENT, `Name` TEXT, `Email` TEXT, `MobileNumber` INTEGER, `Username` TEXT, `Password` text, `Address` text, `Qualification` TEXT )";
db.execSQL(query3);
String query4 = "CREATE TABLE IF NOT EXISTS \"exam_table1\" ( `StudentID` INTEGER PRIMARY KEY AUTOINCREMENT, `StudentName` TEXT, `SubjectName` TEXT, `SubjectCode` TEXT, `MaxMarks` INTEGER, `MarksScoredByStudent` INTEGER, `Grade` TEXT, `StudentRegNo` integer, FOREIGN KEY(StudentRegNo) REFERENCES student_and_parent_table1(ID) )";
db.execSQL(query4);
答案 0 :(得分:0)
有两个潜在问题(由于代码有限,因此无法确切说明为什么要插入NULL)。
第一个是默认情况下,外键支持处于关闭状态,因此需要打开。要启用外键支持,您可以覆盖数据库助手的 onConfigure 方法,以调用 SQLiteDatabase 的 setForeignKeyConstraintsEnabled 方法,例如
@Override
public void onConfigure(SQLiteDatabase db) {
super.onConfigure(db);
db.setForeignKeyConstraintsEnabled(true);
}
第二个是关于什么是外键的常见误解。
定义外键时,您只是在添加一个约束(规则),该约束说子列中的值必须是父列中存在的值。 NULL是一种异常/特殊情况,表示与父级没有任何关系(除非将NOT NULL约束应用于子级列)。
一个常见的误解是,指定外键会自动分配值,而不会,它只会检查要插入的值是否是有效值,而您仍然必须以编程方式确定要插入的值。
这样,您可能希望向子( StudentRegNo )列添加 NOT NULL 约束,这将强制使用有效值。
例如使用:-
String query4 = "CREATE TABLE IF NOT EXISTS \"exam_table1\" ( `StudentID` INTEGER PRIMARY KEY AUTOINCREMENT, `StudentName` TEXT, `SubjectName` TEXT, `SubjectCode` TEXT, `MaxMarks` INTEGER, `MarksScoredByStudent` INTEGER, `Grade` TEXT, `StudentRegNo` integer NOT NULL, FOREIGN KEY(StudentRegNo) REFERENCES student_and_parent_table1(ID) )";