SQLite中使用约束解决插入/更新重复问题网址:http://www.cnphp.info/sqlite-conflict-on-update.html
一直以来在使用SQL语句的时候都是力求简洁,把SQL精简到最优化以提高效率。这是做Web程序时养成的习惯。不过,最近在一个c#程序中使用到嵌入式数据库SQLite,让我对SQL语句的要求更提高了一步。例如,在向数据库中插入新行时,如果违背了某一唯一性约束。那么整个更新过程就会失败。更要命的是如果同时插入1000条、10000条甚至更多条数据的时候,如果仅仅因为某条数据出错,导致整个过程rollback了,似乎在性能上就得不偿失了。
起初我想了一个比较笨的办法,聪明的你可能已经想到了^_^,先用select语句查询是否存在重复,剔除到重复后在插入新数据。对于大批量数据的插入/更新,这的的确确是个笨办法。
后来想到用触发器做这个,效果不错,但为这么个简单的问题就动用触发器似乎也不合理喔。最后在查询手册的过程发现了一条语句可以很好地解决重复问题。
ON CONFLICTconflict-algorithm
conflict-algorithm::= | ROLLBACK|ABORT|FAIL|IGNORE|REPLACE |
这个是用在新建数据表的时候,如果是在插入或更新语句中使用就可以使用 OR 代替 ON Conflict。
例如: insert or ignore into table (fields) values (values);
或者干脆使用 replace into table (fields) values (values);
replace = insert or replace
很好地解决了更新/插入重复的问题^_^