外來鍵約束失效--級聯更新刪除
阿新 • • 發佈:2019-01-04
public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub String classesSQL = "CREATE TABLE classes(class_id varchar(10) primary key , " + "class_name varchar(20))"; String studentsSQL = "CREATE TABLE students(student_id varchar(10) primary key , " + "student_name varchar(20) ,score varchar(4) ,class_id varchar(10), " + "foreign key (class_id) references classes(class_id) " + "on delete cascade on update cascade )"; db.execSQL(classesSQL); Log.d("my", "create table classes:"+classesSQL); db.execSQL(studentsSQL); Log.d("my", "create table students:"+studentsSQL); }
在建立表的時候有建立外來鍵,進行了級聯更新和級聯刪除,但是在刪除一個班級的時候,發先屬於該班級的學生卻沒有刪除,也就是說
on delete cascade on update cascade
失效了。
經查資料知道:SQLite在3.6.19版本中才開始支援外來鍵約束,但是為了相容以前的程式,預設並沒有啟用該功能,如果要啟用該功能每次都要需要使用如下語句:PRAGMA foreign_keys = ON來開啟。
也就是說,在執行刪除一個班級的語句的時候需要執行db.execSQL("PRAGMA foreign_keys=ON")
/** * 刪除一個班級 * 同時會刪除students中該班級的學生 * @param class_id */ public void deleteClass(String class_id) { SQLiteDatabase localSQLiteDatabase = this.dbhelper.getWritableDatabase(); //設定了級聯刪除和級聯更新 //在執行有級聯關係的語句的時候必須先設定“PRAGMA foreign_keys=ON” //否則級聯關係預設失效 localSQLiteDatabase.execSQL("PRAGMA foreign_keys=ON"); Object[] arrayOfObject = new Object[1]; arrayOfObject[0] =class_id; localSQLiteDatabase.execSQL("delete from classes where class_id=?", arrayOfObject); localSQLiteDatabase.close(); }