2011-07-07 40 views

回答

30

您可以指定在表定义,这将使行是REPLACE d一个UNIQUE指数:

CREATE TABLE mytable (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    name TEXT NOT NULL, 
    UNIQUE (id) ON CONFLICT REPLACE 
) 

如果行INSERT或UPDATE语句试图添加一行已经存在一个id,现有的行被替换为新的。

+1

+1潜在的危险,但也是有用的功能我还没有听说过befor。 – piotrpo

+3

确实,您必须小心并确保它在所有情况下都是理想的结果。它适用于将本地数据库与远程数据同步等功能。 –

+0

谢谢。这将现在工作。但是,据我了解,如果我用这个声明创建一个表格,它会在每次出现冲突时进行替换。但是如果我不想在每次插入时使用这种冲突解决方案呢? – kibibyte

0

默认情况下,我有唯一的索引异常将被引发重复索引插入。常见的解决方案是之前检查记录是否存在执行插入 - 伪代码:

select * from people where name = 'Smith'; 
//if resultset is empty then perform insert 
insert into people values 'Smith' 
6

有一个ON CONFLICT子句中的SQLite,你可以说INSERT INTO ... ON CONFLICT...

请阅读文档。 http://www.sqlite.org/lang_conflict.html

+0

事实上,如果你不总是想要取代冲突。 –

+0

这是否适用于多个插入语句? – kaz