Как обеспечить уникальность поля

Статус
В этой теме нельзя размещать новые ответы.

Dador

Читатель
Заблокирован
Регистрация
14 Янв 2008
Сообщения
368
Реакции
100
  • Автор темы
  • Заблокирован
  • #1
Вот я пишу грабилку, многопоточную, и получается так что урл-ов с пачки страниц около 1-3к. И есть таблица в БД
Код:
[B]pages[/B]
Таблица со списком урлов к парстингу

Поле   	       Тип 	        Ноль 	По умолчанию 	Комментарии
url  	        varchar(1000) 	Да  	  	  	Урл страницы  	 
parse   	varchar(4) 	Да  	NULL  	  	Спарстилась ли?  	 
lastparse  	int(100) 	Да  	NULL  	  	Дата Последнего прохода парсером
и есть индекс для того чтобы url был уникальным

Код:
[B] Индексы:[/B]
Имя ключа 	Тип 	Количество элементов 	Поле
url           UNIQUE 	6720 	                 url


Мне приходится подавать каждый урл чере mysql_query - сам понимаю что по идее дофига уходить ресурсов должно, так и есть данные в БД либо не доходят, либо же доходят, но медленно...
Если подавать всю пачку урлов одим, или несколькими запросами то получается если хоть 1 урл не уник, то будет ошибка то что дубликат...


Вообщем как обеспечить уникальность, при условии что подавать каждый урл через mysql_query не могу...

у меня mysql 5, PHP 5
 
Заменить в своём запросе INSERT на REPLACE .
 
  • Автор темы
  • Заблокирован
  • #3
это я пробывал, но тогда будет заменятся и lastparse и parse, а при таком смысла в уникальности никакого
Смысл в уникальности в том, чтоб в базе не было дубликатов, а не в том чтоб поля не обновлялись.

У тебя при инсерте эти поля не меняются что-ли? Задачу опиши по человечески.
 
  • Автор темы
  • Заблокирован
  • #5
Смысл в уникальности в том, чтоб в базе не было дубликатов, а не в том чтоб поля не обновлялись.

У тебя при инсерте эти поля не меняются что-ли? Задачу опиши по человечески.

в начале я делаю выборку:
Код:
SELECT * FROM `pages` WHERE `parse` IS NULL OR `lastparse` <=текущее время LIMIT 0 ,15
затем прохожу по урлам, и с этих страниц записываю в базу урл-ы
Код:
INSERT INTO `pages` ( `url` ) VALUES ('url)'
ну, это естественно циклом, т.е. вначале делается выборка, потом прохожу по урлам, когда сграбились урлы им присваивается не нулевое parse, затем всё сначала.

т.е. если просо заменять скрипт будет ходить по кругу...
 
Допиши к запросу ON DUPLICATE KEY UPDATE parse = parse.
Другое в голову пока не приходит.
 
1. чтобы ошибок не выдавало юзай - INSERT IGNORE
2. Чтобы сэкономить на длине индекса и не отказыватся от уникальности, введите доп.поле hash = md5(url) и по нему сделайте уникальный ключ. Для обновления не юзайте REPLACE, так как это фактически delete + insert, что приводит к перестроению индекса. Юзайте как вам посоветовали верно - ON DUPLICATE KEY UPDATE lastparse = NOW()
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху