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

Тема в разделе "Базы данных", создана пользователем Dador, 17 май 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Dador

    Dador Читатель

    Заблокирован
    Регистр.:
    14 янв 2008
    Сообщения:
    368
    Симпатии:
    97
    Вот я пишу грабилку, многопоточную, и получается так что урл-ов с пачки страниц около 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
     
  2. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Заменить в своём запросе INSERT на REPLACE .
     
  3. Dador

    Dador Читатель

    Заблокирован
    Регистр.:
    14 янв 2008
    Сообщения:
    368
    Симпатии:
    97
    это я пробывал, но тогда будет заменятся и lastparse и parse, а при таком смысла в уникальности никакого
     
  4. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Смысл в уникальности в том, чтоб в базе не было дубликатов, а не в том чтоб поля не обновлялись.

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

    Dador Читатель

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

    т.е. если просо заменять скрипт будет ходить по кругу...
     
  6. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Допиши к запросу ON DUPLICATE KEY UPDATE parse = parse.
    Другое в голову пока не приходит.
     
    Dador нравится это.
  7. newd

    newd Создатель

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