Изменилась ли ваша схема с добавлением ограничения UNIQUE позже?Ваша схема и SQL должны работать как положено.Я только что попробовал это, и он отлично работает:
sqlite3
CREATE TABLE IF NOT EXISTS user_results (id INTEGER PRIMARY KEY ASC AUTOINCREMENT, gameID INTEGER UNIQUE, gameDesc TEXT, result INTEGER);
insert into user_results values (1,1,'hi', 1); --insert 2 test rows
insert into user_results values (2,2,'2', 2);
select * from user_results;
1|1|hi|1
2|2|2|2
Теперь вставка не удается:
insert into user_results values (3,1,'1', 1);
Error: column gameID is not unique
REPLACE INTO делает то, что вы ожидаете:
replace into user_results (gameid, result) values (2, 3);
select * from user_results;
1|1|hi|1
3|2||3
Он удаленстроку с идентификатором 2 и заменили ее новым идентификатором строки 3 и gameid 2. Разве вы не ожидали, что он заменит первичный ключ = 2 строки?Что делает Sqlite, так это удаляет все предыдущие строки, которые могут привести к нарушению уникального ключа, а затем вставляет новую строку.См. http://www.sqlite.org/lang_conflict.html. Обратите внимание, что это не добавило ДОПОЛНИТЕЛЬНУЮ строку.Он удалил один и добавил один (другими словами, «replace»:)
Если ваша замена в SQL включает столбец id, это будет работать, здесь я эффективно обновляю строку с идентификатором 3. Конечно,вам нужно будет определить идентификатор строки, которую вы хотите заменить ...
replace into user_results values (3,3,'2', 2);
select * from user_results;
1|1|hi|1
3|3|2|2
Столбец идентификатора действительно вас интересует?В любом случае Sqlite создаст для вас такую колонку.