加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

外键约束失效--级联更新删除

发布时间:2020-12-12 20:02:19 所属栏目:百科 来源:网络整理
导读:public void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubString classesSQL = "CREATE TABLE classes(class_id varchar(10) primary key," + "class_name varchar(20))";String studentsSQL = "CREATE TABLE students(student_id varc
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();
	}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读