Как проверить, существует ли уже значение, чтобы избежать дублирования? - PullRequest
30 голосов
/ 14 сентября 2008

У меня есть таблица URL-адресов, и я не хочу дублировать URL-адреса. Как проверить, присутствует ли данный URL в таблице с использованием PHP / MySQL?

Ответы [ 17 ]

0 голосов
/ 20 августа 2011

Вы можете найти (и удалить), используя самостоятельное соединение. Ваша таблица имеет некоторый URL-адрес, а также некоторое количество PK (мы знаем, что PK не является URL-адресом, поскольку в противном случае у вас не будет дубликатов)

SELECT
    *
FROM
    yourTable a
JOIN
    yourTable b -- Join the same table
        ON b.[URL] = a.[URL] -- where the URL's match
        AND b.[PK] <> b.[PK] -- but the PK's are different

Это вернет все строки с дублирующимися URL.

Скажем, однако, что вы хотели выбрать только дубликаты и исключить оригинал .... Что ж, вам нужно решить, что составляет оригинал. Для целей этого ответа предположим, что самым низким PK является «оригинал»

Все, что вам нужно сделать, это добавить следующее предложение к вышеуказанному запросу:

WHERE
    a.[PK] NOT IN (
        SELECT 
            TOP 1 c.[PK] -- Only grabbing the original!
        FROM
            yourTable c
        WHERE
            c.[URL] = a.[URL] -- has the same URL
        ORDER BY
            c.[PK] ASC) -- sort it by whatever your criterion is for "original"

Теперь у вас есть набор всех не оригинальных дублированных строк. Вы можете легко выполнить DELETE или что угодно из этого набора результатов.

Обратите внимание, что этот подход может быть неэффективным, отчасти потому, что mySQL не всегда хорошо обрабатывает IN, но из OP я понимаю, что это своего рода «очистка» таблицы, а не всегда проверка.

Если вы хотите в INSERT время проверить, существует ли уже значение, вы можете запустить что-то вроде этого

SELECT 
    1
WHERE
    EXISTS (SELECT * FROM yourTable WHERE [URL] = 'testValue')

Если вы получите результат, то можете сделать вывод, что значение уже существует в вашей БД хотя бы один раз.

0 голосов
/ 19 августа 2011

Сделать столбец primary key

0 голосов
/ 17 августа 2011
$url = "http://www.scroogle.com";

$query  = "SELECT `id` FROM `urls` WHERE  `url` = '$url' ";
$resultdb = mysql_query($query) or die(mysql_error());   
list($idtemp) = mysql_fetch_array($resultdb) ;

if(empty($idtemp)) // if $idtemp is empty the url doesn't exist and we go ahead and insert it into the db.
{ 
   mysql_query("INSERT INTO urls (`url` ) VALUES('$url') ") or die (mysql_error());
}else{
   //do something else if the url already exists in the DB
}
0 голосов
/ 14 сентября 2008

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

0 голосов
/ 14 сентября 2008

Если вы просто хотите получить ответ «да» или «нет», этот синтаксис должен дать вам наилучшую производительность.

select if(exists (select url from urls where url = 'http://asdf.com'), 1, 0) from dual
0 голосов
/ 15 сентября 2008

Ответ зависит от того, хотите ли вы знать, когда делается попытка ввести запись с дублирующим полем. Если вам все равно, используйте синтаксис INSERT ... ON DUPLICATE KEY, так как это сделает вашу попытку тихо успешной без создания дубликата.

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

0 голосов
/ 14 сентября 2008

Вы могли бы сделать этот запрос:

SELECT url FROM urls WHERE url = 'http://asdf.com' LIMIT 1

Затем проверьте, если mysql_num_rows () == 1, чтобы увидеть, существует ли он.

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