输入后外键不显示为null

时间:2019-06-18 14:53:52

标签: javascript android sqlite

我创建了一个具有三个表的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);

1 个答案:

答案 0 :(得分:0)

有两个潜在问题(由于代码有限,因此无法确切说明为什么要插入NULL)

问题1-外键支持

第一个是默认情况下,外键支持处于关闭状态,因此需要打开。要启用外键支持,您可以覆盖数据库助手的 onConfigure 方法,以调用 SQLiteDatabase setForeignKeyConstraintsEnabled 方法,例如

@Override
public void onConfigure(SQLiteDatabase db) {
    super.onConfigure(db);
    db.setForeignKeyConstraintsEnabled(true);
}

问题2-约束

第二个是关于什么是外键的常见误解。

定义外键时,您只是在添加一个约束(规则),该约束说子列中的值必须是父列中存在的值。 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) )";