我想在表中插入一个寄存器,结构如下:
db=this.openOrCreateDatabase("calificaciones.db", MODE_PRIVATE, null);
db.execSQL("PRAGMA foreign_keys=ON");
db.execSQL("create table if not exists usuarios (idusuario integer primary key autoincrement, nusuario text, contrasena text, correo text);");
db.execSQL("create table if not exists alumnos (idalumno integer primary key, apellidos text, nalumno text, especialidad text, grado text, grupo text);");
db.execSQL("create table if not exists materias (idmateria integer primary key, nmateria text,"+" docente text, horas integer);");
db.execSQL("create table if not exists calificacion (idcalif integer primary key autoincrement, idalumno integer, idmateria integer, idusuario integer, calificacion integer, parcial integer, foreign key(idalumno) references alumnos(idalumno), foreign key(idmateria) references materias(idmateria), foreign key(idusuario) references alumnos(idusuario));");
但是,在将一个寄存器插入表格" Calificacion"时,它会给我以下错误信息:
android.database.sqlite.SQLiteException: foreign key mismatch - "calificacion" referencing "alumnos" (code 1): , while compiling: insert into calificacion (idalumno, idmateria, idusuario, calificacion, parcial) values (15330050790409,42069,1,10,3);
即使其他表的寄存器与我试图插入" Calificaciones"的数据匹配,也会发生这种情况。我尝试使用完全相同的查询在SQL Fiddle上重现相同的错误,但在该平台中它不会导致任何错误。
我的语法有什么问题?
答案 0 :(得分:0)
来自docs:
如果数据库模式包含需要查找多个表定义以识别的外键错误,则在创建表时不会检测到这些错误。相反,此类错误会阻止应用程序准备以使用外键修改子表或父表的内容的SQL语句。
...
如果出现以下情况,可能会报告外键DML错误:
- 父表不存在,或
- 外键约束中指定的父键列不存在,或
- 父键列 在外键约束中命名的不是主键 父表并且不受使用的唯一约束 在CREATE TABLE中指定的整理顺序,或
- 子表 引用父级的主键而不指定 主键列和主键列的数量 parent与子键列的数量不匹配。
但是,看看你的代码,看起来大多数都被遵循了。您确定在创建过程中没有错误,例如,无法首先创建父表吗? (因为您在插入过程中稍后收到错误,我想知道您是否在此过程的早期错过了错误。)
而且,你确定这些是你正在创建的表吗?因为你有一个if not exists
条款;也许那些具有不同模式的旧版本的表存在,而你当前的(我认为)正确的代码不是现在实际运行的?使用工具从您的设备/模拟器中查看或添加原始SQL Lite数据库,以查看其中的架构是否与您当前提供的命令相匹配。
答案 1 :(得分:0)
如果出现以下情况,可能会报告外键DML错误:[...]
- 外键约束中指定的父键列不存在
在这种情况下,父键列确实不存在:
... foreign key(idusuario) references alumnos(idusuario)
▔▔▔▔▔▔▔ ▔▔▔▔▔▔▔▔▔