微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQLite组合主键设置外键以及出现外键匹配出错System.Data.SQLite.SQLiteException (0x80004005) SQL logic error or missing d

sqlite组合主键设置外键以及出现外键匹配出错System.Data.sqlite.sqliteException (0x80004005) sql logic error ormissing databaseforeign key mismatch - EntitycommodityProperty referencingcommodityPropertytemplate解决方

转载请注明出处:http://blog.csdn.net/aaa123524457/article/details/47950907

问题描述:

一个父表,使用了组合主键(如下图):


一个子表,需要用到上面的父表的模版信息,于是想在子表里建立外键(如下图);


结果在程序运行的时候插入数据,出现了下面的错误提示

2015-8-24 14:19:43

----------------------------------------

System.Data.sqlite.sqliteException (0x80004005): sql logic error or missing database

foreign key mismatch - "EntitycommodityProperty" referencing "commodityPropertytemplate"

at System.Data.sqlite.sqlite3.Prepare(sqliteConnection cnn,String strsql,sqliteStatement prevIoUs,UInt32 timeoutMS,String& strRemain)

at System.Data.sqlite.sqliteCommand.BuildNextCommand()

at System.Data.sqlite.sqliteCommand.GetStatement(Int32 index)

at System.Data.sqlite.sqliteDataReader.NextResult()

at System.Data.sqlite.sqliteDataReader..ctor(sqliteCommand cmd,CommandBehavior behave)

at System.Data.sqlite.sqliteCommand.ExecuteReader(CommandBehavior behavior)

at System.Data.sqlite.sqliteCommand.ExecuteNonQuery(CommandBehavior behavior)

at System.Data.sqlite.sqliteCommand.ExecuteNonQuery()

at PowFundManager.sqliteWrapper.Execute(String sqlQuery,sqliteParameter[] parameter)

转载请注明出处:http://blog.csdn.net/aaa123524457/article/details/47950907

问题分析:

错误信息可以看出:总是提示外键不匹配!!!

其实出现问题的地方也挺简单,就是因为自己的粗心造成的。当然,截图里看到的生成之后的表,我的数据库表都是在程序里用代码直接生成的。说明这个问题有截图就够了,就不贴完整的源码了。

我的子表里新建外键的时候是这样写的:

FOREIGN KEY (commodityProTemID) REFERENCES commodityPropertytemplate(commodityProTemID) ON DELETE CASCADE,

但是父表里面的主键却是这样的:

PRIMARY KEY (commodityProTemID,commodityID)

这下知道问题所在了吧,父表里的主键是组合主键,由两个属性构成的。但是子表里面却只写了一个,而且这个属性的值是有重复的!

这样就肯定会出现外键不匹配的情况(foreign key mismatch)!

问题解决

其实解决很简单,只需要设置组合外键就可以了,看代码

父表不用改,子表代码修改如下:

FOREIGN KEY (commodityProTemID,commodityID) REFERENCES commodityPropertytemplate(commodityProTemID,commodityID) ON DELETE CASCADE,

当然,子表里要先建立commodityProTemID,commodityID两个属性列。

转载请注明出处:http://blog.csdn.net/aaa123524457/article/details/47950907

这样,组合主键的外键设置方法、以及由组合主键引起的外键不匹配的问题就解决了!

原文地址:https://www.jb51.cc/sqlite/199402.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐