Вы можете найти (и удалить), используя самостоятельное соединение. Ваша таблица имеет некоторый 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')
Если вы получите результат, то можете сделать вывод, что значение уже существует в вашей БД хотя бы один раз.