1. 程式人生 > >外來鍵約束失效--級聯更新刪除

外來鍵約束失效--級聯更新刪除

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();
	}