2013-06-05 3 views
2

У меня есть SQLite таблица: , напримерSQLITE: Заменить без auto_increment

CREATE TABLE TEST (id integer primary key, number integer unique, name text); 

Однако мне нужно сделать ЗАМЕНЫ без автоинкремента поля идентификатора при обновлении.

Например: таблица пуста

REPLACE INTO TEST (null, 23, 'Bill'); 
REPLACE INTO TEST (null, 52, 'Jack'); 

Когда я выполнить запрос, SELECT * FROM TEST; я получаю ...

1|23|Bill 
2|52|Jack 

если я ...

REPLACE INTO TEST VALUES (null, 52, 'John'); 

из запроса SELECT * FROM TEST; я получаю ..

1|23|Bill 
3|52|John 

, но мне нужно ...

1|23|Bill 
2|52|John 

Кто-нибудь есть идеи о том, как же это сделать?

+0

Ваш вопрос подразумевает, что 'number' является первичным ключом. Почему же у вас есть еще один первичный ключ? –

ответ

8

Это невозможно с помощью одной команды.

REPLACE всегда удаляет старую запись (если она существует) перед тем, как вставить новую.

Чтобы сохранить значение автоинкремента, вы должны сохранить запись. То есть, обновить старую запись на месте, и вставить новый, только если не старый один не существовало:

db.execute("UPDATE Test SET Name = 'John' WHERE Number = 52") 
if affected_records == 0: 
    db.execute("INSERT INTO Test(Number, Name) VALUES(52, 'John')") 
+0

Спасибо! это, кажется, хороший метод. –