我在我的Android应用程序上安装了sqlite DB来保存预订。 其中一个表包含每个预订的标题,可能包含预订的几个部分,每个预订都有RES_ID,而每个部分都有PART_ID 主表只包含RES_ID作为主键,我有其他表包含每个表中的部分PART_ID和RES_ID都是主键
我有一个案例,我将几个部分对象插入数据库,所以最终会发生的事情是我尝试向表中插入两个或多个具有相同RES_ID的行。 我自然得到SQLiteException,约束违规,因为已经有一行主键。
是否有SQL语句或java方法\ const将通知SQLite失败是正常的,我不知道 不想要例外吗? (仅适用于该表)
答案 0 :(得分:1)
不应该这样做:
INSERT((SELECT v1 AS c1,v2 AS c2,...,vn AS cn)EXCEPT tablename)INTO tablename;
或类似的:
INSERT((SELECT v1 AS c1,v2 AS c2,...,vn AS cn)WHERE NOT EXISTS(SELECT * FROM tablename WHERE pkc1 = pkv1 AND pkc2 = pkv2 AND ... AND pkcj = pkvj))INTO表名;
答案 1 :(得分:1)
如其他人所述,可以使用多列主键。但是应该注意的是,如果你有一些不是由密钥引入的功能依赖,你应该考虑规范你的关系。 http://en.wikipedia.org/wiki/Database_normalization
或者您可以在表格中找到唯一的密钥。 http://www.w3schools.com/sql/sql_unique.asp
答案 2 :(得分:0)
当我的问题正确时,您正在寻找insert or replace
。 Click
replace
是此的捷径。
答案 3 :(得分:0)
可能还有另一种方法,但确实使用替换而不是INSERT可以很好地完成工作。 使用sqlite3控制台客户端检查我能够在谈到的表中插入一个不存在的行。如果该行已存在,则无论如何都会更新这些值。
10x Jeff和janoliver!