2015-06-07 1 views
0

Я просматриваю сайт и сохраняю результаты в sqlite, так как мой сканирование может повторяться каждый месяц, но я не хочу хранить дубликаты результатов в моей базе данных, что мне делать?sqlite insert while drop complete duplicate

Например, первый раз, когда я буду

insert into tableName(A, B, C, D, E) values(a,b,c,d,e) 

тогда моя база данных будет иметь эту запись, в следующий раз, когда я ползти этот сайт, я буду делать то же самое, но я не хочу, чтобы сохранить копию результаты, что я могу сделать лучше всего?

Кроме того, что делать, если я использую MySQL?

+0

Что представляет собой дубликат записи? Должны ли все пять значений быть одинаковыми? – unutbu

ответ

1

Использование SQLite, create your table with a UNIQUE constraint:

CREATE TABLE tableName (A INTEGER, B INTEGER, C INTEGER, D INTEGER, E INTEGER, 
UNIQUE (A, B, C, D, E)); 

затем

INSERT OR IGNORE INTO tableName (A, B, C, D, E) values (a,b,c,d,e); 

will only insert a new record if (a,b,c,d,e) is unique - т.е. уже нет в таблице tableName.

В add a UNIQUE index to an already existent table:

CREATE UNIQUE INDEX unique_idx on tableName(A, B, C, D, E); 

или, используя MySQL, create a table with a unique index:

CREATE TABLE tableName (A INT, B INT, C INT, D INT, E INT, 
UNIQUE KEY unique_idx (A, B, C, D, E)) 

затем use INSERT IGNORE:

INSERT IGNORE INTO tableName (A, B, C, D, E) values (a,b,c,d,e) 

К add a UNIQUE KEY index to an already existent table:

ALTER TABLE tableName ADD UNIQUE KEY unique_idx (A, B, C, D, E); 
+0

У каждой таблицы есть только один индекс или несколько? – 1a1a11a

+1

В одной таблице может быть несколько. – unutbu

+0

Спасибо! Другой вопрос, таким образом, означает ли это, что все A (или B или C ..) должны быть уникальными? – 1a1a11a

1

Вы можете использовать insert ignore

SQLite

insert or ignore into tableName(A, B, C, D, E) values(a,b,c,d,e) 

MySQL

insert ignore into tableName(A, B, C, D, E) values(a,b,c,d,e) 

Будьте осторожны, что разница между двумя кодовыми являются или, они не являются одинаковыми.

Это будет работать, только если у них есть первичный ключ.

0

Вы можете создать временную/вспомогательную таблицу, скажем temp_tableName, имеющую ту же схему, что и tableName. Тогда при сканировании выполнять как

insert into temp_tableName select * from tableName; 

delete from tableName; 

insert into tableName(A, B, C, D, E) values(a,b,c,d,e) 

Вспомогательная таблица необходима причина, если ползать вставка не работает, то у вас есть резервные копии для хранения с. Также рассмотрите следующие шаги: DELETE/INSERT в блоке Transaction для атомарности.

+0

Это помогает, но все равно, что я могу просто удалить дубликат, если найду его уже в таблице?Моя первоначальная мысль заключалась в том, чтобы сделать select * из tableName, где A = a, B = b, C = c, D = d, E = e и проверить, есть ли такая запись. Это хороший способ сделать это? – 1a1a11a

+0

Зависит, если вы выполняете вставку строки/строки, то, вероятно, да, но будет дорого стоить. Поскольку вставка происходит от искателя, я считаю, что это будет объемная вставка; ответил, учитывая это. – Rahul