2013-03-20 3 views
4

Хорошо, так что у нас есть приложение PhoneGap с установкой таблицы какВставка только если идентификатор не существует

tblTest (actualid INTEGER PRIMARY KEY, id INTEGER, name TEXT)

actualid является уникальным идентификатором для устройства и идентификатора сохраняется на сервере боковая база данных. У нас были проблемы с веб-службами, возвращающими повторяющиеся записи, и хотя мы исправляем то, что я хотел добавить что-то в наш sql, что предотвратит добавление дубликатов (исправление плохих данных - это боль).

Наш текущий оператор вставки настроен как

INSERT INTO tblTest (id, name) VALUES (101, 'Bob')

Если вы бежите, что два раза в базе данных будет в конечном итоге выглядит как

actualid | id| name 
     1 | 101| Bob 
     2 | 101| Bob 

И то, что я хотел бы, чтобы это выглядело как is

actualid | id| name 
     1 | 101| Bob 

Вставить или заменить даст мне actualid 2 в примере и любой примере, я нашел с помощью где предложение было установка как

INSERT INTO tblTest SELECT ..... WHERE.....

Который не работает, потому что ни один из данных не находится в таблице еще (если я не делаю новичок ошибка, я не очень хорошо разбираюсь в sqlite или general sql).

+0

С ней кажется, что текущее решение включает в себя создание новой таблицы с идентификатором UNIQUE, перемещение всего, удаление старой таблицы и переименование новой таблицы, при одновременном обеспечении того, чтобы это происходило один раз o n, прежде чем они попытаются что-либо сделать в базе данных и что он ТОЛЬКО случается один раз ... не является в настоящее время действительным решением для нас, я буду добавлять код для ручной проверки базы данных перед вставкой записи. Осторожно, что это такое, в следующий раз, когда я синхронизирую что-то с сервером, он будет автоинкремент, а идентификатор уникален. – Twomz

ответ

10

Использование INSERT OR IGNORE:

INSERT OR IGNORE INTO tblTest (id, name) VALUES (101, 'Bob') 

(Это требует уникальный индекс на id колонке, которая у вас уже есть.)

+0

actualid - это первичный ключ с автоинкрементами для устройства, id - это уникальный ключ, полученный от сервера. Оглядываясь назад, мы должны сделать id UNIQUE, но это не ... могу ли я использовать прагму, чтобы сделать столбец уникальным после того, как таблица была создана? – Twomz

+2

'CREATE UNIQUE INDEX indexname ON tblTest (id);' (и если у вас был уникальный код на 'id', оставьте его) –

+0

Сладкий, я не знал, что вы можете обеспечить уникальность с помощью индекса. Он работает над тестовой базой данных, которую я создал, поэтому я буду внедрять это исправление, а не вручную получать все идентификаторы и проверять их (Yay!). – Twomz

5

Вы можете попробовать это:

INSERT INTO tblTest 
     (id, name) 
     SELECT 101 as id, 'Bob' as name 
     FROM tblTest 
     WHERE NOT EXISTS(SELECT * FROM tblTest WHERE id = 101 and name = 'Bob') 
+0

Это правильно не дублирует записи, которые есть, но новая запись заставляет сделать несколько вкладок. Это может быть потому, что мне все равно, если имя дублируется только «id». – Twomz

Смежные вопросы