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.f2er.com/sqlite/199402.html